Juegos Linux: Ejecutar el Original StarCraft en ODROID

¿Sabías que puedes ejecutar el StarCraft original en tu ODROID? Si no es así, déjame decirte cómo hacerlo, al menos si tienes un ODROID basado en ARMHF como el ODROID-XU4, C1 o U3. En realidad, no es nada nuevo, y lo he sabido desde hace años, aunque no es muy conocido para la mayoría de los usuarios de ODROID. Empecemos con las cosas que necesitas para que funcione y luego hablemos sobre por qué funciona, cómo funciona y cuáles son los límites, si los hay.

Requisitos

  • PC con Windows para instalar StarCraft
  • Un ODROID que ejecute una imagen ARMHF, como el ODROID-XU4 con Debian o Ubuntu
  • Conexión a Internet para descargar e instalar drivers y paquetes para ejecutar StarCraft
  • CD de instalación de StarCraft + Brood War (NO el instalador de Blizzard, sino los CD originales o las imágenes CD)

Preparando la carpeta del juego

En líneas generales, no es una tarea complicada, necesitas los CD originales (o imágenes de CD) de StarCraft junto con la expansión Brood War. Puesto que actualmente Blizzard ofrece un instalador gratuito online de StarCraft y Brood War, hay quien argumentaría que incluso es legal descargar los archivos ISO si no tienes el juego. Sin embargo, ten en cuenta que necesitas los CD o las imágenes de CD de StarCraft ORIGINAL con el complemento Brood War, y NO el instalador online de Blizzard. Una vez que instales el juego y el complemento, también necesitas parchearlo a la versión 1.16.1 (por ejemplo, desde https://www.moddb.com/games/starcraft/downloads/starcraft-brood-war-v1161-patch). Esto es muy importante ya que solo funcionará con esta versión. Una vez que hayas instalado el juego, los complementos y el parche, hay dos cosas más que tienes que hacer. En tu CD de StarCraft (ISO), encontrará el archivo install.exe, que tiene un tamaño aproximado de 600 MB. Copia este archivo en la carpeta de instalación de StarCraft y cámbiale el nombre a StarCraft.mpq. Después, inserta el CD Brood War (ISO) y copia el archivo install.exe también desde aquí, luego cámbiale el nombre a BroodWar.mpq. Este paso es muy importante, ya que es necesario jugar sin el CD. La carpeta resultante debe tener un tamaño de aproximadamente 1,3 GB. Copia esta carpeta en tu ODROID.

Requisitos de instalación y binarios del juego

Una vez que hayas terminado, hay dos cosas que necesitas para ejecutar el juego. Primero, debes descargar los archivos binarios necesarios para ejecutar el juego y extraerlos en la carpeta del juego. Estos binarios fueron creados por notaz, un desarrollador del proyecto OpenPandora que nos ha proporcionado impresionantes herramientas como:

  • PCSX ReARMed – Emulador de Playstation 1 para dispositivos ARM
  • PicoDrive – un emulador Sega muy rápido especialmente para Sega 32X

Dirígete la carpeta del juego StarCraft en tu ODROID y ejecuta el siguiente comando, el cual descargará y extraerá los binarios de StarCraft:

$ wget https://notaz.gp2x.de/misc/starec/libscr.tar.xz -O- | tar xJ
A continuación, necesitas instalar Wine para ejecutar el juego:
$ sudo apt install wine
Después de esto, ya tienes instalados todos los requisitos y en su lugar, podemos probar el juego.

Iniciando StarCraft

Para ejecutar StartCraft necesitas entrar en tu carpeta de StarCraft y ejecutar el siguiente comando:

$ LD_LIBRARY_PATH=. setarch linux32 -L wine libscr_sa_arm.exe.so
Si lo has hecho todo bien, tras un breve momento de carga, StarCraft debería iniciarse y ejecutarse en todo su esplendor a 640x480.

Figure 1 - Booting up StarCraft on an ODROID
Figura 1 - Arrancando StarCraft en un ODROID

Figure 2 - You can play both StarCraft and Brood War
Figura 2: Puedes jugar tanto a StarCraft como a Brood War

Ten en cuenta que el juego fue diseñado para ejecutarse en una pantalla de 4:3 y en una resolución de 640x480, que es con la que el juego se inicia y ejecuta. Si tienes un ODROID que puede cambiar la resolución de la pantalla sobre la marcha, como el ODROID X, X2, U2 / U3 o XU3 / XU4, la pantalla cambiará a 640x480 (si es compatible con tu monitor/TV) y se ejecutará como una aplicación nativa. Si lo ejecutas en un ODROID que no puede cambiar la resolución de la pantalla, como el ODROID C1, es posible que veas una imagen muy pequeña con mucho espacio negro a su alrededor.

Optimizando nuestra configuración

Aunque ya podemos jugar a StarCraft, es bastante molesto empezar a jugar de esta forma, preferiría tener un acceso directo de StarCraft para hacer doble clic e iniciar el juego. Así que vamos a esforzarnos un poco y hacer que la instalación sea perfecta.

Extrayendo iconos

En primer lugar, necesitamos una de las dos herramientas que nos permite extraer los íconos del archivo StarCraft.exe. O instalamos "icontool" o "7zip" para extraer los iconos de un archivo .exe. También necesitamos "imagemagick" para convertir los íconos. Puesto que, en mi opinión, 7zip le resulta útil a cualquier (después de todo, es un compresor/descompresor de archivos) y probablemente ya lo tendrás instalado en tu sistema, elegiremos esta opción. Simplemente para asegurarnos, vamos a instalarlo y luego extraer los íconos.

$ sudo apt install p7zip-full imagemagick
$ 7z x StarCraft.exe .rsrc/ICON
$ mv .rsrc/ICON .
$ rm -r .rsrc
Debes localizar una carpeta llamada ICON en tu carpeta de StarCraft, en la que podrás ver los íconos que el juego nos ofrece. Podemos elegir cualquiera de estos iconos para crear nuestro icono de inicio para el juego. Personalmente, yo prefiero uno llamado "modern 9.ico", pero algunos prefieren el "clásico 14.ico". Dependiendo del que quieras, convertimos el nuevo ícono en algo que nos resulte más útil:
$ convert ICON/9.ico StarCraft.png
Ahora deberíamos ver un buen archivo StarCraft.png en nuestra carpeta StarCraft.

Crear un acceso directo de escritorio

Llegados a este punto, voy a suponer que el juego se encuentra en la carpeta /home/odroid/StarCraft, así que, ajusta esto en las líneas que aparecen a continuación, si estás en una ubicación diferente. Ahora podemos crear un script para iniciar nuestro juego. Abre tu editor de texto favorito e introduce las siguientes líneas:

#!/bin/bash
cd /home/odroid/StarCraft
LD_LIBRARY_PATH=. setarch linux32 -L wine libscr_sa_arm.exe.so
Guarda el archivo como StarCraft.sh en tu carpeta de juegos de StarCraft y asegúrate de que puedes iniciarlo con el siguiente comando:
$ chmod +x StarCraft.sh
A continuación, necesitamos un archivo .desktop que podamos usar para iniciar nuestro juego. Abre tu editor de texto favorito nuevamente y crea un nuevo archivo con el siguiente contenido:
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=/home/odroid/StarCraft/StarCraft.sh
Name=StarCraft
Icon=/home/odroid/StarCraft/StarCraft.png
Guarde este archivo como StarCraft.desktop en tu escritorio (/home/odroid/Desktop/StarCraft.desktop). El último paso es hacer que el archivo sea ejecutable:
$ chmod +x /home/odroid/Desktop/StarCraft.desktop
Ahora debería ver un nuevo icono llamado StarCraft en tu escritorio, y cuando hagas doble clic sobre él, el juego debería iniciarse.

Figure 3 - This brings back memories of one of my favorite games of all time
Figura 3: Esto me trae muchos recuerdos de uno de mis juegos favoritos de todos los tiempos.

Figure 4 - StarCraft plays as well as it played 20 years ago
Figura 4: StarCraft se juega tan bien como hace 20 años

Optimizando el rendimiento

Es posible que notes un ligero retrardo aquí y allá, lo cual se debe al hecho de que, por defecto, Wine intenta usar OpenGL para mejorar la experiencia de juego a la hora de renderizar las ventanas. Los ODROID no tienen OpenGL, y realmente no es necesario para este juego, de modo que es mejor deshabilitarlo por completo. Para esto solo necesitamos instalar winetricks y ejecutar un único comando:

$ sudo apt install winetricks
$ winetricks ddr=gdi
Con esto, el juego debería ejecutarse sin problemas en tu ODROID.

(Opcional) Ejecutar en modo ventana Es posible que no te guste que el juego cambie la resolución de tu pantalla a 640x480, o tu televisor (o ODROID) no admite el cambio a 640x480. Para esto, hay una opción con la que puedes ejecutar el juego en una ventana. En la línea de comando, ejecuta el siguiente comando, que abrirá una ventana de configuración de wine:

$ winecfg
Cambia a la pestaña "Gráficos" y marca la casilla de verificación junto a "Emulate a virtual desktop". Esto ejecutará tu juego directamente en tu escritorio en una ventana. Puesto que la ventana seguirá siendo solo de 640x480, te sugiero que uses una resolución de escritorio más pequeña, como 1280x720, por ejemplo. De esa manera, la ventana no parecerá es esté tan perdida en una pantalla tan grande. Con esto, ahora tienes todo lo que necesitas para ejecutar StarCraft en tu ODROID. Puede ejecutarlo en pantalla completa a 640x480, o en una ventana en tu escritorio. Ahora disponemos de un buen acceso directo en el escritorio que podemos usar para jugar cuando queramos. En este punto, deberías tener una experiencia de StarCraft y Brood War totalmente funcional. Todo está ahí: videos, música, sonido, niveles, con todas las campañas y niveles individuales a los que puedes jugar. Si está contento con esto, puede dejar de leer, ya que lo que sigue ahora es simplemente información técnica sobre cómo funciona, por qué usa Wine y por qué no se ejecuta en imágenes ARM64 (por ejemplo, en ODROID- N2 o C2).

Figure 5 - Configure wine to run in a virtual desktop so we don’t need to switch resolution on our Monitor / TV
Figura 5: configurar Wine para que se ejecute en un escritorio virtual y así no necesitemos cambiar la resolución en nuestro monitor/televisor

Figure 6 - Running StarCraft in a Window directly on the desktop, keep in mind the window is only 640x480 and can’t be changed
Figura 6: Ejecutar StarCraft en una ventana directamente en el escritorio, ten en cuenta que la ventana es solo de 640x480 y no se puede cambiar

Cómo funciona

Quiero explicar cómo funciona esto, incluido por qué el juego se ejecuta en ODROID basados en ARMHF pero no en ODROID ARM64, específicamente para qué se utiliza Wine y la finalidad del archivo que descargamos y extrajimos.

Wine – (W)ine (I)s (N)ot an (E)mulator Sigue habiendo una idea errónea sobre wine. Éste te permite ejecutar programas y juegos de Windows en Linux emulando una máquina con Windows. Esto no es cierto: ¡Wine NO convierte tu Linux ARM en un sistema Windows x86! Wine es una reimplementación de Windows-API, lo que significa que los comandos que un archivo .exe de Windows envía al sistema operativo Windows y a la CPU son traducidos a código Linux que se ejecuta en Linux. Imagínatelo así: si un archivo .exe de Windows tiene un código que dice "abrir una nueva ventana del tamaño de 100x100 píxeles", este código es traducido en un comando de Linux que hace lo mismo, creando una nueva ventana que tiene 100x100 píxeles . El código API de Windows utilizado para esto se reescribe para hacer lo mismo en Linux. No obstante, es algo más complejo que esto. En el nivel más básico, tenemos código binario, que significa que el archivo .exe fue escrito para una arquitectura de CPU específica. En el caso de Windows, está escrito para procesadores de 32 bits (código x86) o procesadores de 64 bits (x86_64, también conocido como amd64). Linux tiene lo mismo: un archivo binario para Linux x86 de 32 bits o x86_64 de 64 bits. Puesto que los procesadores de 64 bits pueden ejecutar código de 32 bits normalmente, si tienes drivers de 32 bits instalados, normalmente también puede ejecutar código de 32 bits, razón por la cual la mayoría de las aplicaciones de Windows siguen siendo de 32 bits, aunque se ejecutan en un procesador de 64 bit. Además, muchas aplicaciones antiguas, como StarCraft, por ejemplo, se escribieron cuando solo existían procesadores de 32 bits, por lo que obviamente es un binario de 32 bits (o x86). Ahora los ODROID no tienen ni un procesador x86 ni x86_64. Tienen procesadores ARM que se ejecutan en un ARMHF de 32 bits o en un ARM64 Linux de 64 bits, y aquí es donde empieza el problema. Una aplicación de Windows x86 de 32 bits requiere una instalación wine x86 de 32 bits para convertir el código en código Linux x86 de 32 bits. Una instalación de wine ARMHF de 32 bits solo puede traducir código armhf de Windows de 32 bits en código Linux ARMHF de 32 bits (lo mismo ocurre con el código arm64). Lo que significa que para ejecutar StarCraft x86 en ODROID, los ODROID tendrían que ejecutar una versión x86 de Wine, pero dado que los ODROID son placas ARM, esto no es posible, a menos que uses la emulación x86 en ODROID, que tiende a ser bastante lenta. Funcionaría si hubiera una versión ARMHF de StarCraft, porque si hubiera un ARMHF StarCraft.exe de 32 bits para Windows, podríamos ejecutarlo bajo una versión de wine ARHF. Desafortunadamente, nunca ha habido una versión ARMHF de StarCraft, ni una versión ARMHF de Windows para la que existan programas o juegos (si ignoras los teléfonos de Windows, que no ejecutan una versión completa de Windows).

¿Por qué funciona?

Aquí es donde entra en juego notaz, ya que hizo exactamente eso: crear una versión ARMHF de StarCraft. Si revisas la carpeta del juego, verás que solo hay unos cuantos archivos binarios para StarCraft (archivos .exe o .dll), y algunos son para el editor y pueden ignorarse, ya que no usaremos el editor. El resto están relacionados con StarCraft.exe y algunas librerías que se utilizan para ejecutar los archivos de video. Notaz "desmontó" el código de estos archivos binarios. Para aquellos que no sepan de lo que estoy hablando, existe un lenguaje de programación llamado "Ensamblador" que está muy cerca de cómo funciona un procesador y es difícil de entender o leer:

# -----------------------------------------------------------------------------
# A 64-bit Linux application that writes the first 90 Fibonacci numbers. It
# needs to be linked with a C library.
#
# Assemble and Link:
# gcc fib.s
# -----------------------------------------------------------------------------

.global main

.text
main:
push %rbx # we have to save this since we use it

mov $90, %ecx # ecx will countdown to 0
xor %rax, %rax # rax will hold the current number
xor %rbx, %rbx # rbx will hold the next number
inc %rbx # rbx is originally 1
print:
# We need to call printf, but we are using eax, ebx, and ecx. printf
# may destroy eax and ecx so we will save these before the call and
# restore them afterwards.

push %rax # caller-save register
push %rcx # caller-save register

mov $format, %rdi # set 1st parameter (format)
mov %rax, %rsi # set 2nd parameter (current_number)
xor %rax, %rax # because printf is varargs

# Stack is already aligned because we pushed three 8 byte registers
call printf # printf(format, current_number)

pop %rcx # restore caller-save register
pop %rax # restore caller-save register

mov %rax, %rdx # save the current number
mov %rbx, %rax # next number is now current
add %rdx, %rbx # get the new next number
dec %ecx # count down
jnz print # if not done counting, do some more

pop %rbx # restore rbx before returning
ret
format:
.asciz "%20ld\n"
Ensamblador funciona principalmente en registros de CPU, razón por la cual el código depende mucho del procesador. Un registro CPU de 64 bits no cabe en un registro de CPU de 32 bits, por lo tanto, un comando de 64 bits no puede ejecutarse en un procesador de 32 bits. Este código es mucho más difícil de entender que, por ejemplo, el código C o C ++, y como he dicho, no se ejecuta en una arquitectura de CPU extraña. Sin embargo, hay llamadas equivalentes en una arquitectura de CPU diferente. Comparar dos registros en Asamblador es lo mismo en ARM que en x86, excepto que los registros son diferentes. Algunos códigos que existen para x86 no existen de la misma manera bajo ARM, pero el mismo resultado se puede lograr de una manera diferente Lo que esto significa es que, si pones MUCHO esfuerzo en traducir el código binario desmontado de Windows x86 al código binario ARMHF, terminarás con un binario ARMHF de Windows que hace lo mismo que el binario x86, excepto ARMHF. Esto es más o menos lo que hizo notaz, más algunas cosas adicionales. El resultado son los binarios que hemos descargado y que están disponibles en https://notaz.gp2x.de/misc/starec/libscr.tar.xz. Con esto, tenemos los archivos binarios ARMHF de Windows, que ahora podemos ejecutar en ARMHF Wine para traducir las llamadas API al código de Linux, lo que tiene como resultado la posibilidad de ejecutar StarCraft en ODROID.

¿Por qué esto no funciona en el ODROID-C2 o N2?

Si has seguido mi explicación, deberías saber por qué no funciona. Solo tenemos binarios ARMHF StarCraft que se ejecutan en una versión ARMHF de Wine. ODROID-N2 y C2 ejecutan un sistema operativo ARM64 de 64 bits, y tu versión Wine también es una versión ARM64, que no ejecuta binarios ARMHF de Windows. Entonces, podrías preguntarse, puesto que las CPU ARM64 son técnicamente capaces de ejecutar el código ARMHF, ¿funcionaría si el ODROID-N2/C2 ejecutara una versión ARMHF de Wine? La respuesta a eso es: ¡SÍ! Si ejecutas un sistema operativo ARMHF en tu ODROID-C2 o N2, también puedes ejecutar StarCraft. Incluso debería funcionar si añades ARMHF como arquitectura extranjera a tu imagen e instala la versión ARMHF de Wine, pero para ser honesto, aún no lo he probado.

Be the first to comment

Leave a Reply