Command & Conquer Generals được port native lên macOS·iPhone·iPad bằng Fable
(github.com/ammaarreshi)- Command & Conquer Generals: Zero Hour chạy trên Apple Silicon Mac, iPhone, iPad mà không cần giả lập, cho phép chơi trực tiếp tựa RTS kinh điển trên các thiết bị Apple hiện đại
- Điểm cốt lõi là biên dịch ARM64 từ engine thực tế năm 2003; đồ họa được chuyển đổi theo tuyến DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
- Dựa trên bản phát hành mã nguồn GPL v3 của EA và bản port GeneralsX cho macOS/Linux, fork này bổ sung hỗ trợ iOS/iPadOS và các chỉnh sửa engine
- Tài nguyên game không được bao gồm, nên người dùng phải tự lấy dữ liệu từ bản sao mình sở hữu, chẳng hạn trên Steam
- Chơi lâu trên iPad có thể bị thoát do mức bộ nhớ thường trú khoảng từ 3GB trở lên, và vẫn còn khả năng crash khi chuyển sang nền trên iOS, nên cần lưu game thường xuyên
Engine Zero Hour thực sự chạy trên thiết bị Apple
- Zero Hour chạy native trên Apple Silicon Mac, iPhone, iPad
- Hỗ trợ các chế độ chiến dịch, skirmish và Generals Challenge
- Có thao tác cảm ứng cho RTS
- Chạm để chọn
- Kéo khung để chọn
- Nhấn giữ để bỏ chọn
- Cuộn bằng hai ngón tay
- Chụm để zoom
- Cách chạy không phải giả lập, mà là dạng biên dịch engine thực tế năm 2003 sang ARM64
- Rendering đi theo chuỗi DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
Phạm vi của fork dựa trên GeneralsX
- Mã engine dựa trên bản phát hành mã nguồn GPL v3 của EA
- Bản port nền tảng là fbraz3/GeneralsX; phần việc cốt lõi của bản port macOS/Linux được thực hiện trong GeneralsX
- Fork này bổ sung bản port iOS/iPadOS và các chỉnh sửa engine
- README gốc của GeneralsX nằm ở nhánh
upstream-main
Người dùng phải tự chuẩn bị tài nguyên game
- Tài nguyên game không được bao gồm hoặc phân phối
- Người dùng cần có bản sao game của riêng mình
- Có cung cấp liên kết Steam, kèm ghi chú rằng khi giảm giá giá khoảng 5 USD
scripts/get-assets.shlà script lấy dữ liệu game trên Steam mà người dùng sở hữu; app ID đích là 2732960
Luồng build và chạy trên macOS
- Build trên macOS cần một số bước chuẩn bị chỉ phải làm một lần
xcode-select --installbrew install cmake ninja meson pkgconfbrew install --cask steamcmd- Clone đầy đủ
vcpkgvà thiết lậpVCPKG_ROOT - Cài LunarG Vulkan SDK và thiết lập
VULKAN_SDK
vcpkgcần clone đầy đủ vì dùng shallow clone có thể làm hỏng manifest baseline- Vulkan SDK phải dùng LunarG Vulkan SDK, không phải Homebrew cask
- Sau khi clone repository, chạy lần lượt các script sau
./scripts/build/macos/build-macos-zh.sh: kiểm tra phụ thuộc, cấu hình, build./scripts/build/macos/deploy-macos-zh.sh: tạo~/GeneralsX/GeneralsZHvàrun.sh./scripts/get-assets.sh <your_steam_username>: lấy dữ liệu game mà người dùng sở hữucd ~/GeneralsX/GeneralsZH && ./run.sh -win: chạy
Điều kiện build cho iPhone·iPad
- Build iOS/iPadOS cần thêm bản Xcode đầy đủ, đăng nhập Apple ID,
xcodegenvà Apple Developer team, ngoài các bước chuẩn bị cho macOS - Quy trình build gồm các yếu tố sau
- Khởi tạo submodule
references/fbraz3-dxvk - DXVK cho iOS được build từ submodule đó và
Patches/dxvk-ios.patch - Lấy phiên bản cố định của MoltenVK.framework có checksum bằng
./scripts/build/ios/fetch-moltenvk.sh - Chuẩn bị Liberation Fonts theo tên mà game kỳ vọng bằng
./scripts/build/ios/stage-fonts.sh - Build bằng
cmake --preset ios-vulkanvàcmake --build build/ios-vulkan --target z_generals
- Khởi tạo submodule
- Để đóng gói và cài đặt, thiết lập
GX_TEAM_IDvàGX_BUNDLE_IDrồi chạy./scripts/build/ios/package-ios-zh.sh --install - Team ID được xem trong Xcode → Settings → Accounts
- Tài nguyên được đưa vào trong app bundle để thành bản cài đặt tự chứa;
--devbỏ qua việc sao chép khoảng 2,7GB nhằm lặp nhanh phần code
Các tệp và tài liệu đáng xem trong repository
docs/port/PORTING_PLAYBOOK.md: nhật ký kỹ thuật đầy đủ của bản port, ghi lại các chế độ lỗi, nguyên nhân gốc và cách sửa- §8 bug archaeology xử lý các vấn đề như minimap đen, thoại EVA bị mất tiếng và lỗi chirp
docs/port/PORTING_PATTERNS.md: phương pháp luận tổng quát để port game Windows cổ điển sang nền tảng Appledocs/port/RELEASE_CHECKLIST.md: các cổng kiểm tra cho bản phát hành công khaiscripts/get-assets.sh: script lấy tài nguyên Steam mà người dùng sở hữuscripts/build/macos/,scripts/build/ios/: pipeline build, triển khai và đóng góiios/: dự án stub ký bằng XcodeGen và các tệpOptions.ini,dxvk.confđã chuẩn bị trongios/config/Patches/dxvk-ios.patch: các thay đổi DXVK dùng để build dylib d3d8/d3d9 cho iOS
Những hạn chế còn tồn tại
- Các phiên chơi dài trên iPad có thể bị iOS chấm dứt khi mức bộ nhớ thường trú khoảng từ 3GB trở lên
- Khi đó, app thoát ra màn hình chính mà không có hộp thoại
- Log của phiên hiện tại và phiên trước nằm trong thư mục game của ứng dụng Files
- Vấn đề này đang được điều tra
- Trên iOS, thỉnh thoảng có thể crash nếu chuyển game sang nền trong lúc đang chơi
- Cơ chế tạm dừng vòng đời xử lý các đường đi thông thường
- Vẫn còn một race condition hiếm gặp, nên cần lưu game thường xuyên
Giấy phép và cách thực hiện
- Mã engine là GPL v3, với luồng là bản phát hành mã nguồn của EA → GeneralsX → fork này
- Tài nguyên game không được bao gồm và không được cấp phép tại đây
- Phần ghi công bao gồm Westwood/EA Pacific, EA, fbraz3/GeneralsX, TheSuperHackers/GeneralsGameCode, DXVK, MoltenVK, SDL, OpenAL Soft, FFmpeg, Liberation Fonts
- Bản port được tạo ra bằng hợp tác giữa con người và AI
- Phần kỹ thuật do Claude Code, tức mô hình Claude Fable của Anthropic, đảm nhiệm
- Ammaar Reshi định hướng và playtest trên thiết bị thực
- Nhật ký kỹ thuật trong
docs/port/là bản ghi chưa biên tập về cách làm việc đó
1 bình luận
Ý kiến trên Hacker News
Đây có vẻ là một trường hợp sử dụng khá hay, trong đó con người dẫn dắt mô hình để thực hiện chuyển đổi quy mô lớn
Tuy vậy, tài liệu port nên được con người chỉnh lại một chút. Văn phong do AI tạo ra khá khó chịu
Rủi ro thấp, phần lớn làm cho vui và có thể cải tiến lặp lại. Nó khác với chuyện Bun nói rằng “đã đổi hết từ Zig sang Rust, tất nhiên chạy tốt, sắp đưa vào production được, và chúng tôi cũng sẽ viết blog về những gì đã làm”, nhưng đến giờ vẫn chưa có bài đó
Dù bị xem là ví dụ dùng LLM tệ, nó đã được dùng trong production một thời gian rồi, và tôi chưa nghe bằng chứng nào cho thấy vì Claude Code mà lỗi hay lỗi segmentation tăng đáng kể so với trước
“Khá ổn, không tệ, một trường hợp sử dụng tốt” cơ đấy. Fable rốt cuộc đã làm được chuyện gì vậy
Những thứ như
(tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom)là một kiểu diễn đạt rất AI khác thường thấy ở các coding agentCó vẻ chúng thích tóm tắt các khái niệm tương đối phức tạp và cụ thể thành danh từ ghép mới, hoặc đôi khi là động từ, như thể đó là một cụm một từ. Không rõ là để tiết kiệm token hay để tạo một định danh ngắn gọn có thể tham chiếu lại sau này, nhưng khá dễ nhận ra
Câu kết quả khó đọc, nhưng nếu biết khuynh hướng đó và chủ động phân tích cụm danh từ thì sẽ đỡ hơn. Dù sao tôi nghĩ cũng ổn, vì đó là sản phẩm trung gian của coding agent chứ không phải bài luận hay bài blog
Một số ngôn ngữ Germanic vận hành kiểu đó. Theo bản năng muốn ghép danh từ lại thành kiểu
lawnchair, rồi bị gạch chân chính tả;lawn chaircũng trông lạ, nênlawn-chairtrở thành vùng trung gian## Dùng lời dễ hiểu, không dùng thuật ngữ chuyên mônTôi dặn không dùng thuật ngữ rút gọn, mà hãy nói đúng điều thực sự muốn nói
Ví dụ, thay vì “load-bearing assumptions” thì viết “các giả định mà xyz phụ thuộc vào”, và đừng nói “cross-service” mà hãy nêu trực tiếp tên dịch vụ X và dịch vụ Y
Cũng cấm các phán định bằng cụm danh từ trừu tượng như “Cross-RCA double-counting is unfounded”, và bắt viết kiểu “đã kiểm tra xem cùng một nguyên nhân gốc có bị tính hai lần giữa các lần chạy RCA hay không, và kết quả là không”
## Không tuyên bố làm rung chuyển thế giớiBỏ những phóng đại như “phát hiện quan trọng làm thay đổi mọi thứ”, “giờ đã nắm được toàn cảnh”, “đây là game changer”, và viết thẳng thắn nội dung đã phát hiện
## Đừng phản xạ làm mờ câu trả lời yesNếu câu trả lời là yes thì hãy nói yes. Nếu mọi câu trả lời khẳng định đều kèm điều kiện thì mức độ chắc chắn bị yếu đi, nên chỉ thêm điều kiện khi thật sự có bất định cụ thể
Nó khâu 2–4 khái niệm cao cấp lại thành một hoặc hai từ, khiến lần nào tôi cũng phải yêu cầu “giải thích đầy đủ”. Với người bản ngữ chắc cũng không dễ, nhưng với người không bản ngữ thì còn khó hơn
Điểm mấu chốt là nó được xây trên fbraz3/GeneralsX, dựa trên bản phát hành mã nguồn GPL v3 của EA. Phần lớn công việc port sang macOS/Linux do GeneralsX làm, còn fork này bổ sung port sang iOS/iPadOS và một vài chỉnh sửa engine
Không có vẻ là phải cực kỳ vất vả, và Opus 4.6 chắc cũng đủ làm
Tôi tự hỏi kỹ thuật này có hữu ích với Emperor: Battle for Dune (2001) không
Đây là game chiến thuật thời gian thực 3D đầu tiên của Westwood Studios và ra trước C&C Generals vài năm. Độ phổ biến bị hạn chế vì tranh chấp quyền sở hữu trí tuệ và việc đưa vào các phe mới lệch khỏi bối cảnh gốc, nhưng gameplay, nhạc nền và các nhiệm vụ chiến dịch đều xuất sắc
Hồi nhỏ tôi đã dành vô số giờ cho trò này, và càng lớn lên, khi công nghệ vượt qua nền tảng vốn được nhắm tới ban đầu, việc chơi lại càng ngày càng khó
Nếu nằm trong tay những fan tận tâm, đây là một chỗ rất hợp để AI hỗ trợ. Khi có thời gian, tôi cũng muốn thử nghiệm bản đồ hoặc đơn vị do người dùng tạo. Cộng đồng modding của C&C Generals luôn khá sôi nổi
Nói cho những người ngốc đến sau khác biết: lỗi dưới đây có nghĩa là bạn chưa mua game trên Steam
"ERROR! Failed to install app '2732960' (No subscription)"Dĩ nhiên README đã ghi sẵn rồi
Không đời nào Fable làm việc này. Nó hẳn đã dừng lại ở cụm “command and conquer”, hạ cấp xuống Opus, đồng thời đưa vào danh sách theo dõi của NSA luôn
Nói “đã dùng Fable” là sao, khi commit đầu tiên từ tháng 2 năm ngoái?
Tương tự, tôi đang dùng AI để “mã nguồn mở hóa” Battle for Middle Earth trên cùng engine: https://github.com/dginovker/BFME-Source-Code
Chẳng phải việc đơn giản decompile mã nguồn từ binary rồi công khai là có vấn đề sao?
Đây không phải phương pháp clean-room, và các công ty vẫn có thể cho rằng đó là vi phạm bản quyền rồi khiến dự án bị gỡ xuống
Tiêu đề là câu view
Công việc này bắt đầu từ tháng 2, và nhìn commit thì phần Fable làm chỉ là một phần nhỏ trong các commit mới nhất. 19 commit trong tổng số 2000: https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...
Hơn nữa có thể còn không phải Fable. Có khả năng đã bị hạ xuống Opus
Vì những thông tin sai lệch thường xuyên như thế này, tôi trở nên hoài nghi với các tuyên bố về LLM của Anthropic. Trong workflow phát triển web, khi so với GPT 5.5 thì hai bên lúc hơn lúc kém, và Fable sau khi được bật lại để tôi bắt đầu thử cũng vậy
Tôi nghĩ một LLM tử tế nào đó cũng sẽ làm được việc port này. Những thứ như GLM 5.2 có lẽ cũng làm được, và có khi còn tốt hơn vì nó không liên tục đoán xem tôi có phải khủng bố đang định hack chính phủ hay chế tạo vũ khí sinh học không
Mọi người thiếu tài nguyên để so sánh LLM, nên dễ ám chỉ rằng mô hình mình dùng là tốt nhất từ trước đến nay và đã mở ra workflow mới. Sau Opus 4.6, tôi hầu như không thấy cải thiện nào
Các commit của chủ sở hữu fork bắt đầu từ 19 giờ trước, nên chuyện phần đó được làm bằng Fable là hoàn toàn hợp lý. Tuy nhiên, tôi cũng hoàn toàn không rõ việc thêm hỗ trợ iOS có phải là việc các mô hình trước không làm được và chỉ Fable mới làm được hay không