1 puntos por GN⁺ 4 시간 전 | 1 comentarios | Compartir por WhatsApp
  • 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.sh es 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 --install
    • brew install cmake ninja meson pkgconf
    • brew install --cask steamcmd
    • clonar vcpkg completo y configurar VCPKG_ROOT
    • instalar el SDK de Vulkan de LunarG y configurar VULKAN_SDK
  • vcpkg necesita 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/GeneralsZH y run.sh
    • ./scripts/get-assets.sh <your_steam_username>: obtiene los datos del juego que posee el usuario
    • cd ~/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, xcodegen y 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.sh obtiene una versión fija con checksum de MoltenVK.framework
    • ./scripts/build/ios/stage-fonts.sh prepara Liberation Fonts con los nombres que espera el juego
    • compilación con cmake --preset ios-vulkan y cmake --build build/ios-vulkan --target z_generals
  • Para empaquetar e instalar, hay que definir GX_TEAM_ID y GX_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 --dev omite 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
  • docs/port/PORTING_PATTERNS.md: metodología generalizada para portar juegos clásicos de Windows a plataformas Apple
  • docs/port/RELEASE_CHECKLIST.md: criterios de validación para una liberación pública
  • scripts/get-assets.sh: script para obtener recursos de Steam que el usuario ya posee
  • scripts/build/macos/, scripts/build/ios/: pipelines de compilación, despliegue y empaquetado
  • ios/: proyecto stub de firma con XcodeGen y Options.ini, dxvk.conf ya preparados en ios/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

 
GN⁺ 4 시간 전
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.

    • No entiendo bien lo de Bun. Bun está ejecutando Claude Code, que probablemente sea una de las apps de desarrollo más usadas ahora mismo.
      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.
    • Si el modelo hizo el trabajo y probablemente tenía todo dentro de la ventana de contexto, quizá aquí incluso sea más adecuado para escribir la documentación.
    • Decir “un buen uso: una persona guiando a un modelo para hacer conversiones masivas” se queda muy corto. Tal vez sea la subestimación del año.
      “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.

    • Yo también lo hago a veces.
      En algunos idiomas germánicos se hace así. Instintivamente quieres juntar sustantivos y hacer algo como lawnchair, pero aparece el subrayado del corrector; lawn chair también se ve raro, así que lawn-chair queda como punto intermedio.
    • Es realmente molesto. Intenté prohibirlo en AGENTS.md, pero no funciona al 100%.
      ## Palabras simples, no jerga
      Le 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 mundo
      Le 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 reflejo
      Si 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.
    • Quizá los LLM simplemente sean alemanes.
    • Para no ser hablante nativo, hablo y escribo inglés bastante fluido, pero este es el mayor obstáculo con Claude.
      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 excesiva-guionización es obsesión-con-la-IA.
  • 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.

    • Hay algo similar en marcha para Renegade, y como todo eso se está haciendo desde cero en otro motor, parece totalmente posible.
    • Este juego corre tan mal en Windows moderno que hace falta un retroport a Winx64.
    • Exacto. Lo que hizo Fable fue, más o menos, portar a iOS un proyecto que ya era multiplataforma.
      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.

    • Sería bueno que Fable lo intente antes del 7 de julio, cuando desaparezca del precio de la suscripción de Claude Code.
    • Fue uno de los mejores juegos de estrategia en tiempo real de esa época y todavía se deja jugar bien. La música también era muy buena.
    • Voy a intentar hacerlo.
    • ¿No será Dune 2000? https://www.openra.net/download/#linux
    • Me encantaba ese juego. Fue mi primer juego de estrategia en tiempo real.
  • 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.

    • Cuando empiece a leer las secciones de código sobre la facción china y la facción terrorista, de verdad suena probable.
  • ¿Cómo es eso de que “usaron Fable” si el primer commit es de febrero del año pasado?

    • Después de hacer fork de GeneralsX, solo agregaron los últimos commits.
    • Probablemente no se hizo solo con Fable.
    • No fue así; es simplemente otro texto de marketing gratis para Anthropic.
  • 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

    • He hecho trabajos parecidos con algunos juegos antiguos que me gustan, pero la afirmación de que es “idéntico byte por byte” me preocupa.
      ¿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.

    • Este proyecto es un fork, y lo que realmente hace es agregar soporte para iOS.
      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í.