Compilemos como en 1992 (2014)
(fabiensanglard.net)- El código fuente original de Wolfenstein 3D de 1992 no encaja directamente con los sistemas modernos, pero puede volver a compilarse si se recrea el entorno de DosBox y Borland C++ 3.1
- Los componentes necesarios se resumen en el código fuente de Wolfenstein 3D, DosBox, Borland C++ 3.1 y los assets shareware para ejecutar el juego
- En el proceso de build, además de configurar el proyecto de Borland C++, hay que corregir manualmente las rutas de
PATH,SIGNON.OBJyGAMEPAL.OBJ - La razón por la que los gráficos se ven corruptos al ejecutarlo por primera vez es que el índice de gráficos compilado en el motor no coincide con las posiciones internas de los archivos de assets
- Al copiar los assets VGA regenerados y activar el aspect correction de DosBox, puede ejecutarse con una apariencia cercana a la relación de aspecto de los CRT de 1992
Recrear el entorno de build de 1992
- El código fuente original de Wolfenstein 3D de 1992 es difícil de usar tal cual en sistemas modernos después de más de 20 años, pero puede compilarse si se ajustan las herramientas y el entorno de ejecución de la época
- Los componentes necesarios son estos cuatro
- Código fuente de Wolfenstein 3D
- DosBox
- Borland C++ 3.1
- Assets shareware de Wolfenstein 3D
Preparar directorios para usarlos como unidades DOS
- Se crean localmente dos directorios para usarlos como unidades DOS
system/csystem/a
- En
system/ase descarga el archivo comprimido de Borland C++ 3.1 - En
system/cse descargan el código fuente de Wolfenstein 3D y los archivos VGA - Después de descomprimir, la disposición de archivos queda así
system/a:BCPP31.zipsystem/c:wolfsrc.zip,vgafiles.zip
Instalar el compilador y el código fuente en DosBox
- Tras ejecutar DosBox, se montan las carpetas locales como unidades DOS
- Se monta
~/system/ccomoC: - Se monta
~/system/acomoA:
- Se monta
- En
A:\BCPP31, se ejecutainstallpara instalar Borland C++ 3.1- Se mantiene la configuración predeterminada y se inicia la instalación
- La advertencia de que no se puede encontrar la carpeta de Microsoft Windows no es necesaria, así que se avanza con Enter
- En
C:\, se ejecuta el instalador del código fuente de Wolfenstein 3D y se usa la ruta predeterminada\WOLFSRC
Build del proyecto en Borland C++
- Se ejecuta Borland C++ 3.1 con
C:\BORLANDC\BIN\BC.EXE - Se abre el proyecto
..\..\WOLFSRC\WOLF3D.PRJy se configuran los directorios asíInclude Directories: C:\BORLANDC\INCLUDELibrary Directories: C:\BORLANDC\LIBOutput Directories: OBJSource Directories: C:\WOLFSRC
- En el primer build aparece el error
Cannot find executable TASM- Se cierra Borland C++, se configura
PATH=C:\BORLANDC\BINy se vuelve a ejecutar
- Se cierra Borland C++, se configura
- En el siguiente build aparece el error
Unable to find OBJ fileen la etapa de enlaceSIGNON.OBJyGAMEPAL.OBJestán especificados erróneamente en el proyecto con la rutaC:\SOURCE\WOLF\- Se eliminan ambos elementos del proyecto y se vuelven a agregar como
WOLFSRC\OBJ\SIGNON.OBJyWOLFSRC\OBJ\GAMEPAL.OBJ
- Después, al ejecutar
Compile -> Build All, el build se completa correctamente
Assets de ejecución y causa de los gráficos corruptos
- Para ejecutar el archivo compilado se necesitan los assets de la versión shareware o de la versión completa de Wolfenstein 3D
- Si después de instalar la versión shareware se copia el
.EXEcompilado a la carpeta del juego y se ejecuta, la pantalla se muestra de forma extraña - La causa está en el pipeline de producción que crea los archivos gráficos y en la forma en que el motor accede a los assets
- Adrian Carmack y Kevin Cloud creaban los archivos gráficos y luego los empaquetaban con la herramienta IGRABed
- La salida consta de 3 archivos:
VGAHEAD.WL1,VGAGRAPH.WL1,VGADICT.WL1, y 2 archivos:GRE.H,GRE.EQU
VGAHEAD.WL1es un índice que apunta a las posiciones de datos dentro deVGAGRAPH.WL1VGAGRAPH.WL1almacena datos comprimidos con HuffmanVGADICT.WL1contiene el diccionario Huffman para la descompresión
GRE.HyGRE.EQUson archivos que permiten que el motor acceda a los assets por nombre- Por ejemplo, un nombre lógico como
L_GUYPICse conecta con el valor real del índice - El motor se compila con los índices de imagen hardcodeados
- Por ejemplo, un nombre lógico como
- Después del lanzamiento shareware de Wolfenstein 3D, al cambiar los assets y la base de código junto con Spears of Destiny, los índices del juego recién compilado dejaron de coincidir con las posiciones de los archivos de assets existentes
Reemplazo de assets VGA y corrección de relación de aspecto
- La solución es copiar a la carpeta del juego los assets VGA regenerados para que coincidan con los índices
.Hy.EQUincluidos en el código fuente - Si se usan assets shareware, hay que copiarlos cambiando la extensión de archivo de
.WL6a.WL1VGADICT.WL6→VGADICT.WL1VGAGRAPH.WL6→VGAGRAPH.WL1VGAHEAD.WL6→VGAHEAD.WL1
- Tras el reemplazo, al ejecutar de nuevo
WOLF3D.EXE, el juego funciona correctamente - La pantalla predeterminada de DosBox es distinta de la pantalla original que veía la gente en 1992
- El framebuffer VGA es de 320x200
- Los monitores CRT tenían relación de aspecto 4:3, por lo que la salida se veía estirada verticalmente
- Si en la configuración de DosBox se cambia
aspect=falseaaspect=trueen[render], se aplica la corrección de relación de aspecto - Al aplicar también la corrección de relación de aspecto, Wolfenstein 3D se ejecuta con una apariencia cercana al modo en que se mostraba en los CRT de la época
1 comentarios
Comentarios en Hacker News
Recomiendo muchísimo el libro de Wolfenstein 3D mencionado al final del artículo. Aunque es técnico, no se siente rígido ni aburrido, y está lleno de optimizaciones a la vieja escuela, como 64 funciones desplegadas para escalar texturas de paredes, guardar sprites “de lado”, lidiar con tarjetas gráficas rarísimas y hackear el modo gráfico para que al menos pareciera un juego
Parece que todavía no ha salido, ¿no?
Lo bueno de los sistemas retro es que, si reúnes las herramientas, puedes volver a compilar. Hace poco recompilé por diversión el viejo juego Uplink, y lo único que necesité fue Visual Studio 6.0; el archivo de desarrollo incluía todas las dependencias necesarias para el build
Me tomó como una hora cuadrar las dependencias, pero al final funcionó y el juego corre bien. Incluso arreglé un defecto menor e hice pequeñas mejoras por aquí y por allá. Si pienso en tocar software moderno, de verdad parece una locura
thirdparty/, y también se fija la toolchain que se usa, así que la configuración siempre era reproducibleAprendí a programar con Borland Turbo C++. Una de las razones por las que extraño esa época es que podías hacer cosas que parecían complejas con muchísima facilidad. Bastaba con llamar funciones geométricas para dibujar en pantalla, y después de trazar una figura, podías hacer animación llamando
xorsobre una figura ligeramente distintaCon unos amigos hicimos un juego tipo Final Fantasy usando esa técnica, con sprites hechos a mano, mapas por pantalla, un mundo donde al llegar al borde pasabas al mapa adyacente, e incluso un sistema en el que entrabas en combate cuando salía el número natural 1 en cada paso. Era engorroso, pero para unos estudiantes de preparatoria era realmente divertido, y ayudaba mucho que, en vez de tener que aprender SFML, ActiveX u OpenGL desde el principio como hoy, bastaba con llamar
circleconio.hy del BGIgraphics.hde Borland. Hoy en día SDL cumple un poco ese papel, pero no es tan simpleDespués de verlo mencionado varias veces aquí durante años, hace unos meses por fin leí Masters of Doom, y me pareció un libro excelente. Los juegos que hacían en ese entonces ya eran fascinantes de jugar, pero visto en retrospectiva, lo que más inspira es lo que unos cuantos desarrolladores jóvenes con tan pocos recursos pudieron llegar a crear
De verdad extraño la interfaz de texto de DOS. Me hace pensar en ese confiable PS/2 que seguí usando hasta más o menos 1997
¿Instalar en la unidad C:? ¡Eso ya era un lujo! Yo no tenía disco duro, así que me la pasaba cambiando disquetes entre las unidades A y B, y el compilador seguía pidiendo partes intercambiadas. Aun así, nos divertíamos. Los jóvenes de hoy ni nos creerían si les contáramos estas historias
Borland C++ era realmente sobresaliente. Un IDE con compilador de C++, biblioteca estándar y depurador cabía en unos 5 MB, además de esa acogedora paleta de colores de Borland con letras amarillas y fondo azul
Los IDE de MS-DOS de Borland son recuerdos entrañables
Lo usé para algunos días del Advent of Code este año, pero la nostalgia se me pasó rápido. Ya acostumbrado a entornos modernos, las limitaciones del IDE y lo verboso de Pascal no se sentían “divertidos” para el uso diario. Aun así, los recuerdos sí son dulces
En particular, no podían reconocer una pulsación de Alt por sí sola, combinaciones Alt+letra ni Ctrl+Shift+flecha izquierda/derecha
Artículo relacionado: Let’s compile like it’s 1992 (2014) - https://news.ycombinator.com/item?id=13750097 - febrero de 2017, 80 comentarios
Tuve problemas al abrir el archivo. En
wolfsrc.zipme salió el error End-of-central-directory signature not found, diciendo que no era un archivo zip o que podía ser parte de un archivo dividido en varios discoscurl -O [http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsr...](<http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip>), se descargó un archivo HTMLEl resultado de
$ file wolfsrc.ziptambién fuewolfsrc.zip: HTML document text, ASCII text. En cambio,wgetsí descargó el archivo correctamente y pude descomprimirlo sin problemas