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

> Clean Markdown view of GeekNews topic #31138. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31138](https://news.hada.io/topic?id=31138)
- GeekNews Markdown: [https://news.hada.io/topic/31138.md](https://news.hada.io/topic/31138.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-05T10:36:10+09:00
- Updated: 2026-07-05T10:36:10+09:00
- Original source: [github.com/ammaarreshi](https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/tree/main)
- Points: 1
- Comments: 1

## Topic Body

- **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](https://github.com/doitsujin/dxvk) → Vulkan → [MoltenVK](https://github.com/KhronosGroup/MoltenVK) → Metal 순서로 이어짐

### GeneralsX 기반 포크의 범위
- 엔진 코드는 EA의 **GPL v3 소스 릴리스**를 기반으로 함
- 기반 포트는 [fbraz3/GeneralsX](https://github.com/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`](https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/blob/main/docs/port/PORTING_PLAYBOOK.md): 포트의 전체 엔지니어링 로그로, 실패 모드·근본 원인·수정사항을 기록함
  - [§8 bug archaeology](https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/blob/main/docs/port/PORTING_PLAYBOOK.md#8-post-ship-bug-hunts-junejuly-2026--the-archaeology-section)는 검은 미니맵, 무음 EVA 대사, chirp 문제를 다룸
- `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](https://claude.com/claude-code), 즉 Anthropic의 Claude **Fable 모델**이 맡음
  - Ammaar Reshi가 실제 기기에서 방향 설정과 플레이테스트를 수행함
  - `docs/port/`의 엔지니어링 로그는 그 작업 방식의 편집되지 않은 기록임

## Comments



### Comment 61277

- Author: neo
- Created: 2026-07-05T10:36:11+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=48788283) 
- 이건 사람이 모델을 이끌어 **대량 변환**을 시키는 꽤 좋은 활용 사례로 보임  
  다만 포팅 문서는 사람이 조금 다듬었으면 좋겠음. 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](<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](<https://github.com/dginovker/BFME-Source-Code>)
  - 좋아하는 옛 게임 몇 개에 비슷한 작업을 해왔지만, “바이트 단위로 동일”하다는 주장은 걱정됨  
    바이너리에서 소스코드를 단순히 디컴파일해 공개하는 건 문제가 되지 않나?  
    이건 **클린룸 방식**이 아니고, 회사들이 여전히 저작권 침해라고 주장해 내려가게 만들 수 있음

- 제목은 낚시임  
  이 작업은 2월에 시작됐고 커밋을 보면 Fable이 한 건 최신 커밋 중 작은 일부뿐임. 2000개 중 19개 커밋임: [https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...](<https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits/main>)  
  게다가 Fable이 아닐 수도 있음. Opus로 강등됐을 가능성도 있음  
  이런 잦은 오정보 때문에 Anthropic의 LLM 주장에 회의적이 됨. 웹 개발 작업 흐름에서 GPT 5.5와 비교하면 서로 엎치락뒤치락하고, 다시 활성화된 뒤 테스트하기 시작한 Fable도 마찬가지였음  
  괜찮은 LLM이면 이런 포팅은 했을 것 같음. GLM 5.2 같은 것도 가능했을 텐데, 내가 정부를 해킹하려는 테러리스트인지 생물무기를 만들려는지 계속 추측하지 않으니 오히려 더 나았을 수도 있음  
  사람들은 LLM을 비교할 자원이 부족해서, 자기가 쓴 모델이 역대 최고이고 새 작업 흐름을 열어줬다고 쉽게 암시함. Opus 4.6 이후로는 개선을 거의 못 봤음
  - 이 프로젝트는 포크이고 실제로 하는 일은 **iOS 지원 추가**임  
    저장소 포크 소유자의 커밋은 19시간 전부터 시작하니, 그 부분이 Fable로 됐다는 건 충분히 그럴듯함. 다만 iOS 지원 추가가 이전 모델로는 못 하고 Fable만 할 수 있는 작업이었는지는 나도 전혀 불분명함
