Command & Conquer Generals, Fable로 macOS·iPhone·iPad 네이티브 포팅

1 hour ago 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/GeneralsZH와 run.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-vulkan 및 cmake --build build/ios-vulkan --target z_generals로 빌드함
  • 패키징과 설치에는 GX_TEAM_ID와 GX_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/의 엔지니어링 로그는 그 작업 방식의 편집되지 않은 기록임
Read Entire Article