Command & Conquer Generals, Fable로 macOS·iPhone·iPad 네이티브 포팅
5 hours ago
2
- 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/의 엔지니어링 로그는 그 작업 방식의 편집되지 않은 기록임
-
Homepage
-
Tech blog
- Command & Conquer Generals, Fable로 macOS·iPhone·iPad 네이티브 포팅