2 điểm bởi GN⁺ 2025-01-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • DOOM CAPTCHA là một CAPTCHA mang tính thử nghiệm, có tính giáo dục và giải trí, yêu cầu bạn tự chơi DOOM® để chứng minh mình là con người
  • Phần triển khai cốt lõi biên dịch một bản port Doom tối thiểu sang WebAssembly bằng Emscripten, đồng thời kết nối vòng lặp game viết bằng C với UI JavaScript
  • Các trạng thái game cần cho việc đánh giá CAPTCHA, như người chơi được tạo, tử vong hay tiêu diệt kẻ địch, được truyền sang UI thông qua callback JavaScript
  • Các tùy chọn chạy mặc định được đặt là -skill 5, -fast, -warp e1m1, -nomenu, đưa người chơi vào ngay một trận chiến khó mà không qua menu
  • Để sử dụng hợp pháp, dự án đã được điều chỉnh để tương thích với wad shareware doom1.wad; có thể xem mã nguồn và liên kết tạo UI v0

Cấu trúc chạy Doom như một CAPTCHA

  • DOOM CAPTCHA là một CAPTCHA yêu cầu người dùng chơi DOOM® để chứng minh mình là con người
  • Phần triển khai sử dụng Emscripten để biên dịch một bản port Doom tối thiểu sang WebAssembly
  • Vòng lặp game nền C trong g_game.c và UI CAPTCHA nền JavaScript được cấu hình để có thể trao đổi trạng thái với nhau
  • Điểm khởi đầu là một bản port Doom tối thiểu dựa trên SDL, có thể được biên dịch hiệu quả sang WebAssembly
  • Để sử dụng hợp pháp, bản build được điều chỉnh để tương thích với doom1.wad, wad của phiên bản shareware

Các thay đổi game để phù hợp với CAPTCHA

  • Xử lý menu và hồi sinh

    • Thêm các cờ chạy không chính thức để đơn giản hóa tiến trình game cho phù hợp với luồng CAPTCHA
    • -nomenu: bỏ qua menu chính trong m_menu.c và vào thẳng game
    • -autoreborn: tự động hồi sinh người chơi sau 2 giây kể từ khi tử vong trong p_mobj.c
  • Sự kiện game được truyền tới UI

    • UI CAPTCHA nhận trạng thái game thông qua callback JavaScript và dùng chúng trong luồng đánh giá
    • onPlayerBorn: được gọi khi người chơi được tạo hoặc hồi sinh
    • onPlayerKilled: được gọi khi người chơi tử vong
    • onEnemyKilled: được gọi khi người chơi chính tiêu diệt kẻ địch
  • Độ khó chạy mặc định

    • Thay đổi các cờ chạy mặc định trong d_main.c để tạo tình huống khó hơn ngay từ đầu
    • -skill 5: đặt độ khó thành "Nightmare!"
    • -fast: làm game khó hơn
    • -warp e1m1: bắt đầu game tại một điểm có hành động
    • -nomenu: không cho người chơi mở menu chính

Mã nguồn và điều kiện sử dụng

  • Có thể xem kết quả tạo UI v0mã nguồn
  • Dự án này dựa trên phiên bản DOOM® shareware được phát hành cho mục đích phi thương mại, và DOOM® là nhãn hiệu đã đăng ký của id Software LLC

1 bình luận

 
GN⁺ 2025-01-02
Các ý kiến trên Hacker News
  • Tôi đã cố chơi theo cách được thiết kế, nhưng khó quá; hóa ra có thể vượt qua bằng mẹo bằng cách đứng yên ở điểm xuất phát và chỉ bắn kẻ địch xuất hiện từ bên phải

    • Với điều kiện khởi đầu đó thì không phải mẹo, mà là chiến thuật tiêu chuẩn. Đó là cách dùng khi chỉ có súng lục hoặc thiếu đạn cho vũ khí khác
      Trong các game này, độ chính xác của súng lục tốt đến mức vô lý, nên có thể bắn vài phát từ xa để hạ địch; còn đám địch ở đây dùng shotgun, vốn rất kém hiệu quả ở tầm xa. Game mô phỏng độ tản đạn của shotgun rộng một cách phi thực tế, nên ngay cả khi kẻ địch ở xa ngắm chuẩn thì sát thương cũng rất nhỏ
      Ngày trước khi chơi trên NetWare LAN ở trường đại học, chỉ cần giữ khoảng cách là tôi đã thắng được những người cầm vũ khí mạnh hơn nhưng kém chính xác hơn. Thường là shotgun hoặc shotgun hai nòng trong các phiên bản sau, và ai cũng thấy nó đã tay nhất
      Cách này hiệu quả cho đến khi có ai đó áp sát từ phía sau; sau khi chết, nếu hồi sinh ở vị trí ổn thì có thể nhanh chóng tìm lại tên đó và trả thù bằng súng lục. Gặp rocket launcher cũng dùng được, miễn là không bị trúng trực tiếp hoặc không đứng ở chỗ sát thương nổ lệch dễ phá hỏng kế hoạch
      Nói theo kiểu cũ, đây là cách hiệu quả trong nhiều game kiểu DOOM và các hậu duệ của chúng. Trong HL2 cũng vậy, khẩu súng lục cơ bản bắn liên tục theo số lần bấm nút bắn, không có khoảng cách tối thiểu giữa các phát như vũ khí khác, nên rất hữu dụng
    • Đây không phải màn đầu tiên, nhưng điều kiện vũ khí khi vào màn đó thì đúng là như vậy
      Hơn nữa chỉ dùng bàn phím, nên phím mũi tên trái/phải xoay nhân vật; trong game bắn súng góc nhìn thứ nhất hiện đại, ta quen dùng chúng để di chuyển ngang và dùng chuột để xoay, khiến phản xạ bị rối
    • Nếu mọi thứ đều chạy ở phía client thì thậm chí không cần dùng mẹo. Máy chủ không có cách nào xác minh bạn có thật sự giết đủ số kẻ địch cần thiết hay không
    • Tôi cũng làm y hệt. Nhấn mũi tên lùi để lùi lại, rồi mỗi giây nhấn phím cách một lần là xong. Khoảng 30 giây sau thì captcha được giải
    • Đặt màn này ở trạng thái khởi đầu bằng súng lục hơi khắc nghiệt. Ít nhất cũng nên cho shotgun
  • Kỹ thuật +100, tính khả dụng -100. Chuyến tàu ký ức +10, và tôi cũng nhận ra giờ mình chơi game dở rồi

    • Đây là màn bí mật E1M9, thường gặp sau E1M3. Nếu chơi theo tiến trình bình thường, đến lúc này bạn đã có shotgun, chaingun, rocket launcher, và có lẽ cả giáp
      Bắt đầu màn này chỉ với súng lục, mà nhìn như độ khó Ultra-Violence hoặc Nightmare, thì chẳng khác nào cầu cho người chơi bị bắn chết
    • Không có xoay góc nhìn bằng chuột thì khó hơn nhiều. Tôi mất hơn 10 lần mới qua được, mà trong Overwatch tôi ở hạng Diamond
    • Cũng không rõ nó thực sự an toàn trước bot đến mức nào. Thời nay có lẽ có thể tạo một AI chơi DOOM giỏi ngang người
    • Buồn cười là bàn phím của tôi không có phím mũi tên. Tôi có gán chúng ở một layer khác, nhưng cấu hình này không hợp lắm
      Nếu bản triển khai này hỗ trợ WASD vốn giờ là chuẩn, và cho bắn bằng nút chuột trái như bản gốc, thì chứng minh mình là con người sẽ khá dễ
  • Đây là màn khó, và nếu tôi nhớ đúng thì là một trong các màn ẩn. Cũng có cảm giác như bật -fast, và vì không thể di chuyển ngang nên còn khó hơn nhiều. Dù vậy vẫn rất dễ thương

    • Đúng. Đó là E1M9, màn bí mật của bản shareware, ở độ khó Nightmare
      Theo kiểu điều khiển cũ, giữ Alt là có thể di chuyển ngang
      Trên máy tôi âm thanh bị cao một cách kỳ lạ, không rõ vì sao. Nhưng nó khá hợp với trải nghiệm vô lý này nên cũng không vấn đề lớn
    • Trên Firefox ở Linux thì di chuyển ngang được. Có thể hệ điều hành hoặc cài đặt trình duyệt đang chặn
    • Thực sự khó đến vậy à? Tôi đã chuẩn bị càu nhàu nhẹ rằng nó không chạy trên di động, nhưng điều khiển trên màn hình hoạt động tốt và tôi hạ ngay ba tên mà không gặp vấn đề gì
      Có điều gần đây tôi chơi Doom cổ điển khá nhiều
    • Giữ Alt thì chắc chắn có thể di chuyển ngang. Ít nhất là với tôi
    • Đúng, E1M9 nổi tiếng là khó khi khởi đầu bằng súng lục. Tôi nhận ra ngay khi nhìn thấy, điều đó cho thấy hồi nhỏ tôi đã dành bao nhiêu thời gian cho Doom
  • Quái nhiều quá nên tôi phải thử 3–4 lần. Đúng là giống captcha thật

    • Vì vậy tôi hiểu nó là một bản parody
    • Giống CAPTCHA thật, nó là địa ngục với người khuyết tật. 10/10
  • Loại quái vật nào lại không cho WASD, thậm chí tối thiểu cũng không cho Ctrl để bắn vậy? Dù sao vẫn là một captcha ngầu

    • ijkl;
  • Mỗi lần phải giải captcha để đăng nhập vào console AWS, tôi lại nghĩ rằng đối tượng mà thứ này cố ngăn chặn thì có thể tự động hóa rất dễ, trong khi đa số người dùng lại khổ sở vì “tính năng” này
    Một số mô hình mã nguồn mở có thể giải được mà không cần các cổng gác “an toàn AI” kiểu đó
    Apple đã đề xuất một giải pháp cho captcha[1], và tôi đang chờ nó được chuẩn hóa và dùng rộng rãi
    [1] https://support.apple.com/en-us/102591

    • Cơ chế là: “Thay vì yêu cầu CAPTCHA khi bạn đăng nhập vào ứng dụng hoặc website, máy chủ Apple xác minh thiết bị và Apple Account, việc xác minh này được gửi đến một máy chủ phát hành token bên thứ ba đã được Apple xác nhận, rồi máy chủ đó tạo token truy cập riêng tư để xác minh bạn với ứng dụng hoặc website”
      Cách này rõ ràng không tốt hơn cho quyền riêng tư, và trao thêm quyền kiểm soát cho Apple. Tôi thà mất thêm 3 giây cho captcha còn hơn
    • “Bạn sẽ không cần hoàn thành CAPTCHA. Chỉ cần đăng nhập vào ứng dụng hoặc trang web” à, xin miễn. Tôi không muốn
      Đọc đến câu đó là tôi dừng đọc tài liệu hỗ trợ của Apple
  • Một mẩu kiến thức lặt vặt: các nhà làm Doom đã tự chơi để kiểm tra rằng mỗi màn đều có thể vượt qua khi bắt đầu chỉ với súng lục và 50 viên đạn

  • Việc repository GitHub ghi công cho tác giả Doom Captcha gốc là điều đúng đắn. Kỳ vọng của tôi với toàn ngành phần mềm ngày nay đang ở mức thấp nhất mọi thời đại, nên thấy vậy rất mừng
    Bản gốc vài năm trước ở đây
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • Cái này khó thật. Chắc tôi không phải con người rồi
    Lâu lắm rồi tôi chưa chơi Doom, và không có di chuyển ngang thì gần như bất khả thi

    • Như đã nói ở chỗ khác, nhấn Alt + trái/phải là di chuyển ngang được
    • Tiến lên để dụ quái, rồi lập tức quay về điểm xuất phát nấp, và bắn từng con từ xa là được. Dễ mà
  • Cái này được làm bằng trợ lý AI v0 của Vercel
    Link chat ở đây: https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • Ở đây chữ “with” gánh khá nhiều ý nghĩa. Lướt qua log thì có vẻ trợ lý AI chỉ làm phần thiết kế UI, chứ không triển khai game thực sự
      Nghe có thể ấn tượng, nhưng về mặt chức năng thì nó không khác nhiều so với một trình thiết kế UI kéo-thả kiểu winforms, ngoại trừ việc thêm vài tương tác nhỏ như nút hiển thị “loading” trong vài giây. Tiền thân của nó là Visual Basic cũng đã có từ thập niên 90
    • Tôi không thấy phần JS. Có vẻ chỉ dùng trợ lý để dựng layout, còn phần tích hợp DOOM thật sự thì không dùng
      Dù vậy, đoạn chat đó đọc một lúc là thấy khổ sở. Đại ý là kiểu “căn giữa chữ trong nút”, “chưa giữa mà, căn giữa đi”, “làm ơn căn chữ vào giữa”
    • Tôi đã đọc đoạn chat, toàn là những chỉnh sửa chi tiết về layout, và dường như không có chỗ nào thực sự nhúng DOOM vào. Tôi không hiểu là họ giao phần dễ cho AI và tự code phần khó hay sao
    • Như những người khác đã chỉ ra, đó chỉ là phần thiết lập UI
      Repository có phần source còn lại ở đây: https://github.com/rauchg/doom-captcha
      Họ cũng phải sửa Doom để bỏ qua menu và thêm các callback cần thiết, cùng vài điều chỉnh khác