2P by GN⁺ | ★ favorite | 댓글 1개
  • Command & Conquer Generals: Zero Hour가 Apple Silicon Mac, iPhone, iPad에서 에뮬레이션 없이 실행되며, 고전 RTS를 최신 Apple 기기에서 직접 플레이할 수 있게 됨
  • 핵심은 2003년 실제 엔진의 ARM64 컴파일이며, 그래픽은 DirectX 8 → DXVK → Vulkan → MoltenVK → Metal 경로로 변환됨
  • EA의 GPL v3 소스 릴리스와 GeneralsX macOS/Linux 포트를 기반으로, 이 포크가 iOS/iPadOS 대응과 엔진 수정사항을 더함
  • 게임 자산은 포함되지 않으므로 Steam 등에서 소유한 복사본의 데이터를 직접 가져와야 함
  • iPad 장시간 플레이는 약 3GB 이상 메모리 상주로 종료될 수 있고, iOS 백그라운드 전환 충돌 가능성도 남아 있어 자주 저장해야 함

Apple 기기에서 돌아가는 실제 Zero Hour 엔진

  • Zero Hour가 Apple Silicon Mac, iPhone, iPad에서 네이티브로 실행됨
  • 캠페인, 스커미시, Generals Challenge 모드를 지원함
  • RTS용 터치 조작이 포함됨
    • 탭 선택
    • 드래그 박스 선택
    • 길게 눌러 선택 해제
    • 두 손가락 스크롤
    • 핀치 줌
  • 실행 방식은 에뮬레이션이 아니라 2003년 실제 엔진을 ARM64로 컴파일한 형태임
  • 렌더링은 DirectX 8 → DXVK → Vulkan → MoltenVK → Metal 순서로 이어짐

GeneralsX 기반 포크의 범위

  • 엔진 코드는 EA의 GPL v3 소스 릴리스를 기반으로 함
  • 기반 포트는 fbraz3/GeneralsX이며, macOS/Linux 포트의 핵심 작업은 GeneralsX에서 이뤄짐
  • 이 포크는 iOS/iPadOS 포트와 엔진 수정사항을 추가함
  • 원래 GeneralsX README는 upstream-main 브랜치에 있음

게임 자산은 사용자가 직접 준비해야 함

  • 게임 자산은 포함되거나 배포되지 않음
  • 사용자는 자신의 게임 복사본이 필요함
  • Steam 링크가 제공되며, 세일 시 약 5달러라고 안내됨
  • scripts/get-assets.sh는 사용자가 소유한 Steam 게임 데이터를 가져오는 스크립트이며, 대상 앱 ID는 2732960

macOS 빌드와 실행 흐름

  • macOS 빌드에는 한 번만 필요한 사전 준비가 있음
    • xcode-select --install
    • brew install cmake ninja meson pkgconf
    • brew install --cask steamcmd
    • vcpkg 전체 클론과 VCPKG_ROOT 설정
    • LunarG Vulkan SDK 설치와 VULKAN_SDK 설정
  • vcpkg는 얕은 클론을 쓰면 manifest baseline이 깨질 수 있어 전체 클론이 필요함
  • Vulkan SDK는 Homebrew cask가 아니라 LunarG Vulkan SDK를 사용해야 함
  • 저장소를 클론한 뒤 다음 스크립트를 순서대로 실행하는 방식임
    • ./scripts/build/macos/build-macos-zh.sh: 의존성 확인, 설정, 빌드
    • ./scripts/build/macos/deploy-macos-zh.sh: ~/GeneralsX/GeneralsZHrun.sh 생성
    • ./scripts/get-assets.sh <your_steam_username>: 사용자가 소유한 게임 데이터 가져오기
    • cd ~/GeneralsX/GeneralsZH && ./run.sh -win: 실행

iPhone·iPad 빌드 조건

  • iOS/iPadOS 빌드에는 macOS 사전 준비에 더해 전체 Xcode, Apple ID 로그인, xcodegen, Apple Developer team이 필요함
  • 빌드 과정은 다음 요소로 구성됨
    • references/fbraz3-dxvk 서브모듈 초기화
    • iOS용 DXVK는 해당 서브모듈과 Patches/dxvk-ios.patch에서 빌드됨
    • ./scripts/build/ios/fetch-moltenvk.sh로 체크섬이 있는 고정 버전 MoltenVK.framework를 가져옴
    • ./scripts/build/ios/stage-fonts.sh로 Liberation Fonts를 게임이 기대하는 이름으로 준비함
    • cmake --preset ios-vulkancmake --build build/ios-vulkan --target z_generals로 빌드함
  • 패키징과 설치에는 GX_TEAM_IDGX_BUNDLE_ID를 설정한 뒤 ./scripts/build/ios/package-ios-zh.sh --install을 실행함
  • Team ID는 Xcode → Settings → Accounts에서 확인함
  • 자산은 앱 번들 안에 포함되어 자체 완결 설치가 되며, --dev는 빠른 코드 반복을 위해 약 2.7GB 복사를 건너뜀

저장소에서 볼 만한 파일과 문서

  • docs/port/PORTING_PLAYBOOK.md: 포트의 전체 엔지니어링 로그로, 실패 모드·근본 원인·수정사항을 기록함
  • docs/port/PORTING_PATTERNS.md: 고전 Windows 게임을 Apple 플랫폼으로 포팅하는 일반화된 방법론
  • docs/port/RELEASE_CHECKLIST.md: 공개 릴리스 게이트
  • scripts/get-assets.sh: 사용자가 소유한 Steam 자산을 가져오는 스크립트
  • scripts/build/macos/, scripts/build/ios/: 빌드, 배포, 패키징 파이프라인
  • ios/: XcodeGen 서명 스텁 프로젝트와 ios/config/의 준비된 Options.ini, dxvk.conf
  • Patches/dxvk-ios.patch: iOS d3d8/d3d9 dylib 빌드에 사용되는 DXVK 변경사항

아직 남아 있는 제약

  • iPad에서 긴 세션은 약 3GB 이상 메모리 상주 상태에서 iOS에 의해 종료될 수 있음
    • 이 경우 앱은 대화상자 없이 홈 화면으로 나감
    • 현재 및 이전 세션 로그는 Files 앱의 게임 폴더에 있음
    • 해당 문제는 조사 중임
  • iOS에서 게임 중 백그라운드로 전환하면 가끔 충돌할 수 있음
    • 생명주기 일시정지는 일반적인 경로를 처리함
    • 드문 레이스 조건이 남아 있어 자주 저장해야 함

라이선스와 제작 방식

  • 엔진 코드는 GPL v3이며, 흐름은 EA 소스 릴리스 → GeneralsX → 이 포크임
  • 게임 자산은 포함되지 않고, 여기서 라이선스되지 않음
  • 크레딧에는 Westwood/EA Pacific, EA, fbraz3/GeneralsX, TheSuperHackers/GeneralsGameCode, DXVK, MoltenVK, SDL, OpenAL Soft, FFmpeg, Liberation Fonts가 포함됨
  • 포트는 인간+AI 협업으로 만들어짐
    • 엔지니어링은 Claude Code, 즉 Anthropic의 Claude Fable 모델이 맡음
    • Ammaar Reshi가 실제 기기에서 방향 설정과 플레이테스트를 수행함
    • docs/port/의 엔지니어링 로그는 그 작업 방식의 편집되지 않은 기록임

댓글과 토론

Hacker News 의견들
  • 이건 사람이 모델을 이끌어 대량 변환을 시키는 꽤 좋은 활용 사례로 보임
    다만 포팅 문서는 사람이 조금 다듬었으면 좋겠음. AI 생성 문체가 거슬림
    부담이 낮고, 대부분 재미로 하는 일이며 반복 개선도 가능함. Bun이 “Zig에서 Rust로 다 바꿨고 당연히 잘 돌아가며, 곧 프로덕션에 넣어도 되고, 우리가 뭘 했는지 블로그 글도 쓰겠다”고 했지만 그 글은 아직도 없는 상황과는 다름

    • Bun 얘기는 잘 이해가 안 됨. Bun은 아마 지금 가장 많이 쓰이는 개발 앱 중 하나인 Claude Code를 돌리고 있음
      LLM을 나쁘게 쓴 사례라고 하지만 이미 한동안 프로덕션에서 쓰였고, Claude Code 때문에 오류나 세그멘테이션 오류 같은 게 이전보다 유의미하게 늘었다는 증거는 못 들었음
    • 모델이 작업을 했고 아마 전체를 문맥 창 안에 갖고 있을 테니, 여기서는 오히려 문서 작성에 더 적합할 수도 있음
    • “사람이 모델을 이끌어 대량 변환을 시키는 좋은 활용”이라는 표현은 너무 약함. 올해의 과소평가일지도 모름
      “꽤 괜찮고, 나쁘지 않고, 좋은 활용 사례”라니. Fable이 대체 뭘 해낸 거야
  • (tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom) 같은 건 코딩 에이전트에서 자주 보이는 또 다른 AI스러운 표현
    비교적 복잡하고 구체적인 개념을 새 합성 명사나 가끔은 동사로 만들어 한 단어짜리 구문처럼 요약하는 걸 좋아하는 듯함. 토큰을 아끼려는 건지, 나중에 다시 참조할 수 있는 간결한 식별자를 만들려는 건지는 모르겠지만 꽤 눈에 띔
    결과 문장은 읽기 어렵지만, 그런 경향을 알고 의식적으로 명사구를 파싱하면 좀 나아짐. 그래도 코딩 에이전트의 중간 산출물이지 에세이나 블로그 글은 아니니 괜찮다고 봄

    • 나도 가끔 그렇게 함
      일부 게르만어권 언어에서는 그런 식임. 본능적으로 명사를 합쳐서 lawnchair처럼 만들고 싶은데 맞춤법 밑줄이 뜨고, lawn chair도 이상해 보여서 lawn-chair가 중간 지대가 됨
    • 정말 짜증남. AGENTS.md에서 금지해 봤지만 100% 효과는 없음
      ## 쉬운 말, 전문용어 말고
      축약용 전문용어를 쓰지 말고 실제로 뜻하는 바를 말하라고 해둠
      예를 들어 “load-bearing assumptions” 대신 “xyz가 의존하는 가정”이라고 쓰고, “cross-service”라고 하지 말고 X 서비스와 Y 서비스를 직접 이름 붙이게 함
      “Cross-RCA double-counting is unfounded” 같은 추상 명사구 판정도 금지하고, “RCA 실행 간에 같은 근본 원인이 두 번 세어지는지 확인했고 그렇지 않았다”처럼 쓰게 함
      ## 세상을 뒤흔드는 선언 금지
      “중요한 발견이 모든 걸 바꾼다”, “이제 전체 그림을 파악했다”, “게임 체인저다” 같은 과장을 빼고 발견한 내용을 담백하게 쓰게 함
      ## yes를 반사적으로 흐리지 말 것
      답이 yes면 yes라고 말하게 함. 모든 긍정 답변에 단서를 붙이면 확신이 약해지므로, 실제로 구체적인 불확실성이 있을 때만 단서를 달라고 함
    • 어쩌면 LLM은 그냥 독일인일지도 모름
    • 비원어민치고는 영어 말하기와 쓰기가 꽤 유창한 편인데, Claude에서 가장 큰 난관이 바로 이거임
      고급 개념 2~4개를 한두 단어로 꿰매 붙여서 매번 “풀어서 설명해 달라”고 해야 함. 원어민에게도 쉽지는 않겠지만 비원어민에게는 더 어렵다
    • 과도한-하이픈화는 AI-과몰입임
  • EA의 GPL v3 소스 공개판을 기반으로 fbraz3/GeneralsX 위에 만들었다는 부분이 핵심임. macOS/Linux 포팅의 큰 작업은 GeneralsX가 했고, 이 포크는 iOS/iPadOS 포팅과 엔진 수정 몇 가지를 더한 것임

    • Renegade 쪽으로도 비슷한 걸 진행 중인데, 이 모든 걸 처음부터 다른 엔진으로 하고 있어서 충분히 가능해 보임
    • 이 게임은 최신 Windows에서 너무 형편없이 돌아가니 Winx64 역포팅이 필요함
    • 맞음. Fable이 한 건 이미 크로스플랫폼이던 프로젝트를 iOS로 포팅한 정도임
      엄청난 고생이 들어간 것처럼 보이지 않고, Opus 4.6으로도 충분했을 듯함
  • 이런 기법이 Emperor: Battle for Dune(2001)에도 유용할지 궁금함
    Westwood Studios의 첫 3D 실시간 전략 게임이고 C&C Generals보다 몇 년 앞섰음. 지식재산권 분쟁과 원작 설정에서 벗어난 새 진영 도입 때문에 인기가 제한됐지만, 게임플레이와 사운드트랙, 캠페인 임무는 훌륭했음

    • Fable이 Claude Code 구독 가격에서 사라지는 7월 7일 전에 해보는 게 좋겠음
    • 이 시대 최고의 실시간 전략 게임 중 하나였고 지금 해도 괜찮음. 음악도 아주 좋았음
    • 한번 시도해 보겠음
    • 이게 Dune 2000은 아닌가? https://www.openra.net/download/#linux
    • 이 게임 정말 좋아했음. 처음 해본 실시간 전략 게임이었음
  • 어릴 때 이 게임에 셀 수 없이 많은 시간을 썼고, 나이가 들수록 원래 의도된 플랫폼을 기술이 넘어가면서 다시 플레이하기가 점점 어려워졌음
    전념하는 팬들의 손에 있다면 AI가 도울 수 있는 좋은 활용처임. 시간이 나면 사용자 제작 지도나 유닛도 실험해 보고 싶음. C&C Generals의 모딩 커뮤니티는 늘 꽤 활발했음

  • 뒤따라오는 다른 바보들을 위해 말하자면, 아래 오류는 Steam에서 게임을 구매하지 않았다는 뜻임
    "ERROR! Failed to install app '2732960' (No subscription)"
    물론 README에 이미 적혀 있음

  • Fable이 이걸 했을 리 없음. “command and conquer”라는 단어에서 멈추고 Opus로 강등시켰을 것이며, 동시에 NSA 감시 목록에도 올렸을 듯함

    • 중국 진영과 테러리스트 진영을 다루는 코드 구간을 읽기 시작하면 정말 그럴 것 같음
  • “Fable을 사용했다”고 하기엔 첫 커밋이 작년 2월인데 어떻게 된 건가?

    • GeneralsX를 포크한 뒤 마지막 몇 커밋만 추가한 것임
    • 아마 Fable만으로 한 건 아닐 것임
    • 그렇게 한 게 아니고, Anthropic을 위한 또 하나의 무료 마케팅 글일 뿐임
  • 비슷하게 AI를 써서 같은 엔진의 Battle for Middle Earth를 “오픈소스화”하는 작업을 하고 있음: https://github.com/dginovker/BFME-Source-Code

    • 좋아하는 옛 게임 몇 개에 비슷한 작업을 해왔지만, “바이트 단위로 동일”하다는 주장은 걱정됨
      바이너리에서 소스코드를 단순히 디컴파일해 공개하는 건 문제가 되지 않나?
      이건 클린룸 방식이 아니고, 회사들이 여전히 저작권 침해라고 주장해 내려가게 만들 수 있음
  • 제목은 낚시임
    이 작업은 2월에 시작됐고 커밋을 보면 Fable이 한 건 최신 커밋 중 작은 일부뿐임. 2000개 중 19개 커밋임: https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...
    게다가 Fable이 아닐 수도 있음. Opus로 강등됐을 가능성도 있음
    이런 잦은 오정보 때문에 Anthropic의 LLM 주장에 회의적이 됨. 웹 개발 작업 흐름에서 GPT 5.5와 비교하면 서로 엎치락뒤치락하고, 다시 활성화된 뒤 테스트하기 시작한 Fable도 마찬가지였음
    괜찮은 LLM이면 이런 포팅은 했을 것 같음. GLM 5.2 같은 것도 가능했을 텐데, 내가 정부를 해킹하려는 테러리스트인지 생물무기를 만들려는지 계속 추측하지 않으니 오히려 더 나았을 수도 있음
    사람들은 LLM을 비교할 자원이 부족해서, 자기가 쓴 모델이 역대 최고이고 새 작업 흐름을 열어줬다고 쉽게 암시함. Opus 4.6 이후로는 개선을 거의 못 봤음

    • 이 프로젝트는 포크이고 실제로 하는 일은 iOS 지원 추가
      저장소 포크 소유자의 커밋은 19시간 전부터 시작하니, 그 부분이 Fable로 됐다는 건 충분히 그럴듯함. 다만 iOS 지원 추가가 이전 모델로는 못 하고 Fable만 할 수 있는 작업이었는지는 나도 전혀 불분명함