Command & Conquer Generals, port nativo a macOS, iPhone y iPad con Fable
(github.com/ammaarreshi)- Command & Conquer Generals: Zero Hour ahora puede ejecutarse en Apple Silicon Mac, iPhone y iPad sin emulación, permitiendo jugar este RTS clásico directamente en dispositivos Apple modernos
- La clave es la compilación ARM64 del motor real de 2003, y los gráficos se convierten por la ruta DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
- Basado en la liberación del código fuente bajo GPL v3 por parte de EA y en el port de GeneralsX para macOS/Linux, este fork añade compatibilidad con iOS/iPadOS y cambios en el motor
- Como no incluye los recursos del juego, hay que importar manualmente los datos desde una copia propia comprada en Steam u otra plataforma
- En sesiones largas en iPad, la app puede cerrarse al superar cerca de 3 GB de memoria residente, y también sigue existiendo la posibilidad de fallos al pasar la app a segundo plano en iOS, por lo que conviene guardar con frecuencia
El motor real de Zero Hour funcionando en dispositivos Apple
- Zero Hour se ejecuta de forma nativa en Apple Silicon Mac, iPhone y iPad
- Es compatible con los modos campaña, skirmish y Generals Challenge
- Incluye controles táctiles para RTS
- toque para seleccionar
- arrastre para selección por cuadro
- pulsación larga para quitar selección
- desplazamiento con dos dedos
- pellizcar para zoom
- No funciona mediante emulación, sino compilando el motor real de 2003 para ARM64
- El renderizado sigue la cadena DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
Alcance del fork basado en GeneralsX
- El código del motor se basa en la liberación del código fuente bajo GPL v3 de EA
- El port base es fbraz3/GeneralsX, y el trabajo principal del port para macOS/Linux se hizo en GeneralsX
- Este fork añade el port para iOS/iPadOS y cambios en el motor
- El README original de GeneralsX está en la rama
upstream-main
Los recursos del juego deben prepararse por cuenta propia
- Los recursos del juego no se incluyen ni se distribuyen
- El usuario necesita su propia copia del juego
- Se proporciona un enlace de Steam y se indica que en oferta cuesta unos 5 dólares
scripts/get-assets.shes un script para obtener los datos del juego en Steam que el usuario ya posee, y el app ID objetivo es 2732960
Flujo de compilación y ejecución en macOS
- La compilación en macOS requiere una preparación previa que solo se hace una vez
xcode-select --installbrew install cmake ninja meson pkgconfbrew install --cask steamcmd- clonar
vcpkgcompleto y configurarVCPKG_ROOT - instalar el SDK de Vulkan de LunarG y configurar
VULKAN_SDK
vcpkgnecesita un clonado completo porque un clonado superficial puede romper el manifest baseline- Para el SDK de Vulkan no debe usarse el cask de Homebrew, sino el SDK de Vulkan de LunarG
- Después de clonar el repositorio, se ejecutan estos scripts en orden
./scripts/build/macos/build-macos-zh.sh: verifica dependencias, configura y compila./scripts/build/macos/deploy-macos-zh.sh: crea~/GeneralsX/GeneralsZHyrun.sh./scripts/get-assets.sh <your_steam_username>: obtiene los datos del juego que posee el usuariocd ~/GeneralsX/GeneralsZH && ./run.sh -win: ejecutar
Requisitos de compilación para iPhone y iPad
- La compilación para iOS/iPadOS requiere, además de la preparación de macOS, Xcode completo, inicio de sesión con Apple ID,
xcodegeny un equipo de Apple Developer - El proceso de compilación se compone de estos elementos
- inicialización del submódulo
references/fbraz3-dxvk - DXVK para iOS se compila desde ese submódulo y
Patches/dxvk-ios.patch ./scripts/build/ios/fetch-moltenvk.shobtiene una versión fija con checksum de MoltenVK.framework./scripts/build/ios/stage-fonts.shprepara Liberation Fonts con los nombres que espera el juego- compilación con
cmake --preset ios-vulkanycmake --build build/ios-vulkan --target z_generals
- inicialización del submódulo
- Para empaquetar e instalar, hay que definir
GX_TEAM_IDyGX_BUNDLE_ID, y luego ejecutar./scripts/build/ios/package-ios-zh.sh --install - El Team ID se consulta en Xcode → Settings → Accounts
- Los recursos se incluyen dentro del bundle de la app para lograr una instalación autocontenida, y
--devomite la copia de unos 2.7 GB para acelerar la iteración de código
Archivos y documentos destacados del repositorio
docs/port/PORTING_PLAYBOOK.md: registro completo de ingeniería del port, donde se documentan modos de fallo, causas raíz y correcciones- §8 bug archaeology trata el minimapa negro, las líneas EVA sin audio y problemas de chirp
docs/port/PORTING_PATTERNS.md: metodología generalizada para portar juegos clásicos de Windows a plataformas Appledocs/port/RELEASE_CHECKLIST.md: criterios de validación para una liberación públicascripts/get-assets.sh: script para obtener recursos de Steam que el usuario ya poseescripts/build/macos/,scripts/build/ios/: pipelines de compilación, despliegue y empaquetadoios/: proyecto stub de firma con XcodeGen yOptions.ini,dxvk.confya preparados enios/config/Patches/dxvk-ios.patch: cambios de DXVK usados para compilar las dylib d3d8/d3d9 de iOS
Limitaciones que todavía quedan
- En iPad, las sesiones largas pueden hacer que iOS cierre la app al superar cerca de 3 GB de memoria residente
- en ese caso la app vuelve a la pantalla de inicio sin mostrar un diálogo
- los registros de la sesión actual y la anterior están en la carpeta del juego dentro de la app Files
- el problema sigue bajo investigación
- En iOS, cambiar el juego a segundo plano durante una partida puede provocar fallos ocasionales
- la pausa del ciclo de vida maneja la ruta habitual
- aún queda una condición de carrera rara, así que conviene guardar con frecuencia
Licencia y forma de desarrollo
- El código del motor usa GPL v3, y el flujo es: liberación del código fuente por EA → GeneralsX → este fork
- Los recursos del juego no están incluidos ni licenciados aquí
- En los créditos figuran Westwood/EA Pacific, EA, fbraz3/GeneralsX, TheSuperHackers/GeneralsGameCode, DXVK, MoltenVK, SDL, OpenAL Soft, FFmpeg y Liberation Fonts
- El port fue creado mediante colaboración humano+IA
- la ingeniería estuvo a cargo de Claude Code, es decir, el modelo Fable de Claude de Anthropic
- Ammaar Reshi se encargó de la dirección y las pruebas en dispositivos reales
- los registros de ingeniería en
docs/port/son un testimonio sin editar de esa forma de trabajo
1 comentarios
Opiniones en Hacker News
Esto parece un caso de uso bastante bueno: una persona guiando a un modelo para hacer conversiones masivas.
Aunque estaría bien que una persona puliera un poco la documentación del port. El estilo generado por IA molesta.
Es de bajo riesgo, se hace sobre todo por diversión y permite mejoras iterativas. No es como la situación de Bun, que dijo: “cambiamos todo de Zig a Rust, por supuesto funciona bien, pronto se puede poner en producción y también vamos a escribir una entrada de blog sobre lo que hicimos”, pero esa entrada todavía no existe.
Dicen que es un mal uso de un LLM, pero ya lleva un tiempo en producción, y no he visto evidencia de que, por Claude Code, los errores o segfaults hayan aumentado de forma significativa frente a antes.
“Un caso de uso bastante bueno, nada mal, bueno”. ¿Qué demonios logró Fable?
Cosas como
(tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom)son otra expresión con pinta de IA que se ve mucho en agentes de código.Parece que les gusta resumir conceptos relativamente complejos y específicos convirtiéndolos en nuevos sustantivos compuestos, o a veces incluso verbos, como si fueran frases de una sola palabra. No sé si es para ahorrar tokens o para crear identificadores concisos que puedan referenciar después, pero se nota bastante.
El resultado es difícil de leer, pero si conoces esa tendencia y parseas conscientemente las frases nominales, mejora un poco. De todos modos, lo veo aceptable porque es un artefacto intermedio de un agente de código, no un ensayo ni una entrada de blog.
En algunos idiomas germánicos se hace así. Instintivamente quieres juntar sustantivos y hacer algo como
lawnchair, pero aparece el subrayado del corrector;lawn chairtambién se ve raro, así quelawn-chairqueda como punto intermedio.## Palabras simples, no jergaLe dije que no use jerga abreviada y que diga lo que realmente quiere decir.
Por ejemplo, en vez de “load-bearing assumptions”, que escriba “supuestos de los que depende xyz”, y que no diga “cross-service”, sino que nombre directamente el servicio X y el servicio Y.
También prohibí juicios con frases nominales abstractas como “Cross-RCA double-counting is unfounded”, y pedí que escriba algo como “verifiqué si la misma causa raíz se contó dos veces entre ejecuciones de RCA, y no fue así”.
## No hacer declaraciones que sacuden el mundoLe pedí que quite exageraciones como “un hallazgo importante lo cambia todo”, “ahora tenemos el panorama completo” o “es un game changer”, y que escriba de forma sobria lo que encontró.
## No diluir el sí por reflejoSi la respuesta es sí, que diga sí. Si a cada respuesta afirmativa se le agregan salvedades, la certeza se debilita, así que le pedí que solo agregue salvedades cuando exista una incertidumbre concreta real.
Toma de 2 a 4 conceptos avanzados, los cose en una o dos palabras, y cada vez tengo que pedirle que “lo explique con más detalle”. Para un hablante nativo tampoco debe ser fácil, pero para uno no nativo es todavía más difícil.
La clave es que está construido sobre fbraz3/GeneralsX, basado en la versión del código fuente GPL v3 publicada por EA. El gran trabajo del port a macOS/Linux lo hizo GeneralsX, y este fork añade el port a iOS/iPadOS y algunas modificaciones más al motor.
No parece que haya requerido un esfuerzo enorme, y probablemente Opus 4.6 también habría bastado.
Me pregunto si esta técnica sería útil también para Emperor: Battle for Dune (2001).
Fue el primer juego de estrategia en tiempo real 3D de Westwood Studios y salió unos años antes que C&C Generals. Su popularidad fue limitada por disputas de propiedad intelectual y por la introducción de nuevas facciones que se apartaban del canon original, pero la jugabilidad, la banda sonora y las misiones de campaña eran excelentes.
De niño le dediqué incontables horas a este juego, y conforme he envejecido se ha vuelto cada vez más difícil volver a jugarlo porque la tecnología dejó atrás la plataforma para la que fue pensado originalmente.
En manos de fans dedicados, es un buen uso en el que la IA puede ayudar. Si tengo tiempo, me gustaría experimentar también con mapas y unidades creados por usuarios. La comunidad de modding de C&C Generals siempre fue bastante activa.
Para otros tontos que vengan detrás: el error de abajo significa que no compraron el juego en Steam.
"ERROR! Failed to install app '2732960' (No subscription)"Por supuesto, ya está escrito en el README.
Es imposible que Fable haya hecho esto. Se habría detenido en las palabras “command and conquer”, lo habría degradado a Opus y, al mismo tiempo, probablemente te habría puesto en una lista de vigilancia de la NSA.
¿Cómo es eso de que “usaron Fable” si el primer commit es de febrero del año pasado?
De forma similar, estoy usando IA para “abrir el código” de Battle for Middle Earth, del mismo motor: https://github.com/dginovker/BFME-Source-Code
¿No es problemático simplemente descompilar el código fuente desde el binario y publicarlo?
Esto no es un método de sala limpia, y las empresas todavía podrían alegar infracción de copyright y hacer que lo bajen.
El título es clickbait.
Este trabajo empezó en febrero, y si miras los commits, lo que hizo Fable es solo una pequeña parte de los commits más recientes. Son 19 commits de 2000: https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...
Además, quizá ni siquiera fue Fable. Puede que lo hayan degradado a Opus.
Por este tipo de desinformación frecuente me vuelvo escéptico ante las afirmaciones sobre los LLM de Anthropic. En flujos de trabajo de desarrollo web, frente a GPT 5.5, se van alternando, y lo mismo pasó con Fable cuando volvió a activarse y empecé a probarlo.
Creo que un LLM decente habría podido hacer este port. Algo como GLM 5.2 también podría haberlo logrado, y quizá incluso habría sido mejor porque no se la pasa especulando si soy un terrorista que intenta hackear al gobierno o fabricar armas biológicas.
A la gente le faltan recursos para comparar LLM, así que fácilmente da a entender que el modelo que usó es el mejor de la historia y que le abrió un nuevo flujo de trabajo. Desde Opus 4.6 casi no he visto mejoras.
Los commits del dueño del fork del repositorio empiezan hace 19 horas, así que es bastante plausible que esa parte se haya hecho con Fable. Pero tampoco me queda nada claro que agregar soporte para iOS fuera una tarea que modelos anteriores no pudieran hacer y solo Fable sí.