1 puntos por GN⁺ 2023-07-16 | 1 comentarios | Compartir por WhatsApp
  • Proyecto personal de homenaje que implementa en hardware FPGA, sin una CPU estándar, la VM, el blitter y el rasterizer de Another World / Out of This World
  • El diseño central consiste en convertir la VM en un procesador personalizado real, y en un SoC que integra el blitter encargado de copiar y rellenar entre framebuffers, el rasterizer que dibuja polígonos y la actualización de pantalla
  • Los 128 KB de SPRAM del Lattice UP5K encajan con 4 framebuffers de 320x200 a 4 bits, y cada bloque SPRAM de 32 KB corresponde a un framebuffer dentro de esta distribución de memoria
  • Los datos del juego no están incluidos en el almacenamiento; hay que copiar BANK01~BANK0D y MEMLIST.BIN a la carpeta GAMEDATA para poder usar el paquete de datos y el bitstream
  • El modo de ejecución contempla tanto simulación como placa real
    • La simulación puede ejecutar la intro con make simul1 después de instalar Silice
    • El hardware soportado incluye icebreaker + VGA PMOD, mch2022 badge y ULX3S HDMI
    • Se incluyen bitstreams precompilados, pero los datos del juego se requieren por separado
  • La ejecución de la VM obtiene instrucciones y operandos desde la memoria SPI, y para reducir la latencia primero lee 64 bytes en una pequeña caché BRAM
  • La ruta gráfica usa 4 framebuffers, double buffering, restricción de acceso durante el intervalo vblank y arbitraje de acceso al framebuffer entre el blitter y el rasterizer
  • El rasterizer dibuja los polígonos convexos de Another World como spans horizontales, y para efectos de transparencia puede leer y modificar el valor del píxel existente o copiar píxeles desde otro framebuffer de origen
  • El renderizado de texto y algunos fondos de la parte 6 se resuelven guardando en ROM buffers de píxeles prerenderizados y copiándolos por la ruta op_drawString, debido al presupuesto de LUT restante
  • Las limitaciones y tareas pendientes indicadas incluyen ausencia de sonido y música, necesidad de bitstream y paquete de datos separados por parte, validación incompleta del juego completo, ajuste de tiempos más rápido que el original y exploración de cómo conectar las partes
  • La licencia es MIT License para el diseño en Silice, CC BY-NC-SA 4.0 para la documentación, el port de C++ modificado mantiene la GPL original y los datos del juego están protegidos por copyright

1 comentarios

 
GN⁺ 2023-07-16
Comentarios de Hacker News
  • Cuando era niño jugué Out of this World en Sega Genesis y pensé que los gráficos no podían mejorar más.
    Fue la primera vez que vi cinemáticas tan completamente animadas en Sega y me parecieron increíbles. Obviamente los gráficos sí mejoraron después, pero siento que Another World todavía se sostiene perfectamente en lo artístico. Tiene un estilo muy marcado y, cuando lo volví a jugar hace como un año, seguía siendo impresionante.
    Muchos de los acertijos se sienten más como prueba y error, y el juego es extremadamente corto, pero aun así no hay nada que quisiera cambiar. Si eres fan de Another World, también recomiendo Flashback: The Quest for Identity. Tiene una atmósfera cinematográfica parecida; al principio no me gustó mucho, pero en los últimos 10 años me ha ido gustando cada vez más
    • Me encanta Flashback. El entorno cyberpunk me va perfecto, los fondos son hermosos y la historia también está muy bien.
      Aun así, Another World es una obra de arte. El póster del juego parece una pintura al óleo y es realmente hermoso [1]
      [1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
    • Me gustó tanto Flashback que intenté terminarlo en dificultad experto, pero me atoré cerca del final y no pude vencer al slime man
    • La versión de Genesis salió bastante tarde. Yo jugué la versión de Amiga justo después de su lanzamiento en 1991 y fue totalmente impactante; nunca había visto un juego así antes
    • Conocí Flashback primero en Sega y me gustó de inmediato. Cuando después jugué Out of this World me tomó algo de tiempo engancharme, pero ambos son obras de arte magníficas
    • Flashback es de Delphine Software, y el juego de detectives Cruise for a Corpse también usó parte de la misma tecnología de polígonos
  • Material adicional que vale la pena ver:
    Ingeniería inversa y port a JavaScript de Infernal Runner para Amstrad CPC por cyxx. Es una obra del creador de Another World y ambos usan una arquitectura de máquina virtual: https://github.com/cyxx/infernal_js
    Presentación de Norbert Kehrer, The Virtual Machine Architecture of Infernal Runner. La charla es en alemán con diapositivas en inglés: https://media.ccc.de/v/vcfb20_-146-en-202010111400-_th...
    The Story of Another World on the Amiga | MVG: https://www.youtube.com/watch?v=0iz9PJbs5rE
    Port de Another World para Nintendo 64: https://github.com/jnmartin84/aw64
    Port de Another World para PlayStation 1: https://github.com/fgsfdsfgs/rawpsx
  • Si HDL te confunde, esto es un lenguaje personalizado del autor: https://github.com/sylefeb/Silice/tree/master
    Incluye un compilador que compila a Verilog, y el resultado puede integrarse en un flujo de diseño existente
  • La intro era fantástica. Incluso teniendo solo PC speaker y sin tarjeta de sonido, lo era.
    Que desde la primera acción tuvieras que escapar nadando, seguido por huir de una criatura parecida a un león, fue una de las experiencias de juego más brutales de todos los tiempos. Basta jugar este juego un minuto para recordarlo toda la vida
    • Recuerdo haber jugado unos minutos, quizá unas pocas horas como mucho, y casi no avancé, pero esa intro y la primera huida siguen grabadas en mi memoria hasta hoy.
      Para la época, los efectos de cámara dramáticos de este juego realmente se sentían, tal como dice el título, como de otro mundo
    • Nunca jugué este juego directamente, pero una escena promocional de 2 minutos en una cinta VHS que venía con una revista de videojuegos se me quedó clavada en la cabeza durante 30 años.
      La ilustración de la portada también es excelente
    • Tampoco olvidaré jamás el “diálogo” dentro del juego que sale justo después de que tu nuevo amigo te salva de esa cosa parecida a un león.
      konanaka beetzai! motsuubo! /wave
    • No solo la intro: también fue impactante que todo el juego cupiera en un solo disquete
    • Tengo exactamente el mismo recuerdo de haber jugado como un minuto y quedarme atorado. 25 años después lo retomé y lo terminé; si superas la barrera de tiempo de reacción, es un juego excelente y memorable
  • El desarrollador original de Another World dio una charla retrospectiva en la GDC, y está entre las mejores presentaciones de GDC:
    https://www.youtube.com/watch?v=JFaOYYSxSEA
    Si no recuerdo mal, también muestra parte de sus herramientas de desarrollo, incluyendo cómo editaba directamente la animación línea por línea en el bytecode de la máquina virtual y la ejecutaba paso a paso
  • Me pregunto qué tan comunes eran las máquinas virtuales para juegos completos en los 90. Es un juego más viejo que yo, pero ¿en las PC de ese tiempo la capa de máquina virtual no implicaba una pérdida de rendimiento importante?
    • Era mucho más importante lograr que el mismo software corriera en Amiga, x86 (DOS), Mac y muchas otras plataformas.
      Hoy en día hay menos plataformas que en la etapa de crecimiento explosivo de los 80. Incluso ahora, podría decirse que la mayor parte del “software” es JavaScript interpretado por el navegador web. En los 80 también existía el problema de la portabilidad, y de hecho era más difícil porque había que crear el intérprete uno mismo.
      Muchos, quizá la mayoría, de los videojuegos antes de Doom o de los gráficos 3D de alto rendimiento parecen haber sido escritos sobre máquinas virtuales. Los juegos de consola probablemente estaban en C o ensamblador por cuestiones de rendimiento

En esa época, los juegos de “computadora” eran de antes de que la IBM PC se volviera el estándar, o al menos de antes de que la PC ganara y Microsoft dominara. Con Amiga, PC-98, IBM PC, Mac y otras, en una situación donde no se sabía cuál iba a imponerse, tenía sentido crear una máquina virtual, y SCUMM viene de inmediato a la mente.

  • Aun así, no hacían algo como Elite con una máquina virtual tan especializada.
    La portabilidad importaba, pero en esa época, cuando la ley de Moore avanzaba a toda velocidad y la vida útil de las plataformas era efímera, una máquina virtual también daba un efecto de compresión. Un binario completamente compilado podía consumir demasiado espacio en disco o cinta, y también demasiada RAM.
    En cambio, una máquina virtual muy pequeña podía definir un lenguaje personalizado para interpretar al vuelo, y eso reducía mucho el uso de espacio en una época en la que había que ahorrar cada kilobyte. Basta pensar en la diferencia de tamaño entre print "Hello world!" y un binario compilado básico. No importaba qué tan rápido fuera un juego de aventura de texto si no cabía dentro de X KB.
  • En la época dorada del lenguaje ensamblador, las máquinas virtuales también eran comunes en el software empresarial. Era un periodo en el que todavía no existían compiladores de C compatibles con estándares para múltiples sistemas, o eran muy caros, así que facilitaban portar software entre sistemas distintos.
  • La clave de las primeras máquinas virtuales, como la Z-Machine de Infocom, el código Pascal interpretado de Wizardry, SCUMM, Sierra AGI y SCI, Another World, los juegos de Horrorsoft y otros, fue entender bien que los juegos que hacían eran sobre todo “dispositivos de entrega de contenido”.
    Tenían mucho texto y muchos recursos gráficos, y el cálculo era relativamente simple. Las restricciones de autoría solo se conectaban con el hardware en términos de entrada/salida y compresión de datos, y el código que ejecutaba el intérprete normalmente era inicialización de escenas que se corría una sola vez y algunos temporizadores de animación.
    La idea opuesta se ve mejor en los juegos arcade, y después en cosas como Doom y Quake. Lo que el juego simulaba estaba mucho más ligado al hardware, y la definición de la escena se parecía más a datos de mapa —“poner un monstruo aquí y un ítem de vida allá”— que a lógica de scripts.
  • Depende de cómo se vea eso de una “máquina virtual para el juego completo”. Los juegos de aventura de Infocom ejecutaban todo el código del juego en una máquina virtual, y las aventuras gráficas de Sierra y LucasArts también.
    Claro, estas dos últimas usaban algunas primitivas gráficas nativas.
  • Se siente como si Only Amiga makes it possible hubiera sido reemplazado por FPGA 30 años después.
  • La parte de que “[la transparencia] añade complejidad al rasterizador. Para invertir solo un bit de [los valores de color], hay que conocer el valor previo del píxel en esa posición” se acerca a una de las tres ventajas que se obtienen al usar gráficos planares como en Amiga.
    Con bitplanes no hace falta volver a leer la memoria de video. Basta asumir que el bit más alto está dedicado al efecto de transparencia y volcar el span tal cual.
    Las otras dos ventajas son que se pueden mover los planos entre sí para crear vistosos efectos moiré, y que la eficiencia de memoria y de ancho de banda del bus es buena en profundidades de color incómodas que no encajan exacto en bytes o nibbles, como 8 colores (3 bits por píxel) o 32 colores (5 bits por píxel).
  • Gracias a este hilo, al final acepté que nunca voy a terminar este juego por mi cuenta y vi un gameplay en YouTube. Duró 22 minutos. Creo que yo solo había logrado pasar del león una vez.