2 puntos por GN⁺ 2023-08-11 | 1 comentarios | Compartir por WhatsApp
  • Código fuente que contiene el código del juego de la reedición de Quake II 2023 y el código original del juego como referencia, permitiendo a los usuarios crear mods del juego
  • Los mods pueden cargarse en la reedición del mismo modo que en el juego original: usando +set game mymod al ejecutarlo o ingresando game mymod en la consola durante la ejecución
  • Para evitar modificar los archivos originales del juego, se recomienda instalar los mods en el directorio %USERPROFILE%\Saved Games\Nightdive Studios\Quake II
  • La reedición usa una nueva API para la comunicación entre el servidor y los módulos de juego, e introduce un módulo ligero de juego del lado del cliente, similar al módulo cgame de Quake III Arena, para poder cambiar comportamientos del cliente que antes estaban hardcodeados
  • La base de código combina los módulos de juego baseq2, ctf, rogue y xatrix del juego original, y requiere un compilador C++17
  • La compilación solo fue probada con Clang, VS2019 y VS2022; puede compilarse tanto con C++17 como con C++20, y al usar C++20 se puede omitir la dependencia de fmtlib
  • Las dependencias son fmtlib y jsoncpp, y pueden instalarse con vcpkg install jsoncpp:x64-windows fmt:x64-windows
  • Las DLL de la reedición podrían no cargar correctamente los mapas de las expansiones originales, y en algunos casos los mapas fueron modificados para resolver conflictos de spawnflags
  • Los mods existentes podrían migrarse para ajustarse a los cambios en la interfaz de exportación del juego, pero debido a cambios importantes en la estructura y el layout para soportar todas las expansiones en una sola base de código e incorporar nuevas funciones, podría ser necesario reescribirlos al usar la nueva base de código
  • La lógica interna de la DLL del juego fue ajustada a un tickrate de 40 Hz en lugar de los 10 Hz del motor original; se eligieron 40 Hz por el equilibrio entre pasos de 25 ms y consideraciones de ancho de banda y CPU
  • El sistema de guardado registra los datos de nivel y de juego en JSON UTF-8 en lugar de usar offsets de punteros y copias de memoria, y ya no interactúa directamente con el sistema de archivos
  • La reedición de Quake II usa el protocolo de servidor versión 2023; la mayoría de los mensajes son retrocompatibles, pero algunos fueron ajustados para nuevas funciones, funciones modificadas y límites aumentados
  • id Software no puede brindar soporte para este lanzamiento y recomienda usar recursos impulsados por la comunidad

1 comentarios

 
GN⁺ 2023-08-11
Opiniones en Hacker News
  • Quake II fue mi primera experiencia escribiendo C.
    El código era claro, consistente y directo, y aunque no diría que es el mejor código fuente que he leído hasta ahora, sí me puso la vara alta. Después vi mucho código raro en el código fuente de varios juegos, como anidamientos que se salían por el lado derecho de la pantalla o funciones gigantes que hacían mil cosas, y eso fue una lección temprana de que también se pueden hacer cosas geniales con código simple.
    A fines de los 90 y principios de los 2000 daba clases de VR para niños usando Quake y Quake II. Teníamos visores de VR y varias PC con Q.E.D. o Qoole, y hacíamos que estudiantes de 12 a 14 o de 14 a 18 años crearan sus propios juegos de realidad virtual.
    En la práctica, hacían niveles de Quake/Quake II sin monstruos ni armas, y usaban triggers dentro del nivel para mostrar mensajes en pantalla y contar una historia. Un equipo hizo un nivel en el que había que cruzar slime y activar una bomba con un botón para drenarlo; otro equipo hizo un laberinto 3D de agua flotando en el espacio para atravesarlo nadando. Todavía tengo en el disco duro algunos niveles creados por estudiantes, aunque algunos ya no corren bien.
    Para la clase hice un mod que daba una pistola de bengalas en lugar del blaster. Básicamente era el blaster, pero con efectos de sonido distintos, sin modelo de arma, y modificado para que los proyectiles se vieran afectados por la gravedad, rebotaran y se apagaran después de cierto tiempo. Si hubieras estado en esa clase, quizá no habrías podido probar el visor, porque no siempre funcionaba correctamente.

    • El código de id sin duda es limpio y está bien estructurado, pero para alguien común era bastante difícil de entender.
      Los comentarios dentro de las funciones son relativamente escasos, y si no tienes una comprensión sólida de gráficos 3D, aparecen con frecuencia expresiones casi crípticas que te dejan desconcertado. Es esperable, viniendo del trabajo de un pionero de la industria como Carmack, pero para seguirlo con confianza se necesita mucho conocimiento previo y cierta inclinación matemática.
    • Yo también soy culpable de haber escrito código así.
      Antes escribía crónicamente código macarrónico, donde 25 líneas de código servían como esqueleto para una docena de funciones, y encima de eso se apilaba otra docena. Corría rapidísimo, pero la deuda técnica se acumulaba a gran velocidad, y al final esas funciones se volvían intocables por el riesgo de romper muchas de las cosas montadas encima.
      Intentaba explicarlo con comentarios, pero la comunicación no era buena: escribía qué hacía la función, no cómo funcionaba. Cosas como “procesamiento de tabla SINE”, “desfragmentación de fragmentos de tabla”, “interpretación binaria”. Todos decían: “¿Qué diablos es esto? Pero vaya que es rápido”, y creo que si hubiera sido en otro campo que no fueran los videojuegos, ni yo ni el producto habríamos durado mucho.
    • Si te gusta el código de id, quizá también te guste John Carmack on Inlined Code (2014): https://news.ycombinator.com/item?id=12120752
    • No he investigado a fondo el código fuente de id Software, pero sí he visto mucho código fuente de juegos realmente espantoso. La vara está extremadamente baja.
      Me sorprendía que juegos exitosos, divertidos y suficientemente estables se hubieran lanzado con código que por detrás era un completo desastre. Si esa basura armada a las apuradas también puede generar suficientes ganancias, a veces me cuestiono el esfuerzo y el tiempo que dedico a evitar el caos.
    • Ojalá pudieras compartir capturas de pantalla de los resultados de esa clase. Suena realmente genial.
  • Me reí con este pasaje: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
    En el .plan de John Carmack del 31 de enero de 1997, cuenta que fue a una concesionaria Ferrari para comprar un F355 nuevo como auto “razonable”, vio un F40 justo enfrente y terminó comprándolo. Después también escribió su plan de regalar su primer Ferrari como premio al ganador de un torneo de Quake, porque ya tenía demasiados Ferraris.
    El premio era un 328 GTS modelo 1987 con turbo, que había aparecido en la revista Turbo en enero de 1994; en el dinamómetro de chasis daba 360 hp en las ruedas traseras, tenía motor nuevo y pintura nueva, aunque el interior necesitaba algo de trabajo. También pensaba dar efectivo para cubrir impuestos y seguro.

    • ¿Viene un comprador potencial? Entonces dejemos el F40 casualmente estacionado justo al lado de la entrada.
  • Por contar una anécdota de Quake II: fue el primer juego de disparos en primera persona que terminé de principio a fin.
    Lo jugué durante una semana en verano cuando fui a visitar a un amigo que vivía en otro estado; de no haber sido así, creo que jamás me habrían dado permiso. Al empezar, como solo había jugado DOOM, usé los mismos controles, y sorprendentemente funcionaban, así que avancé sin pensarlo mucho.
    Entonces, de pronto, la vista quedó fija en el techo y me confundí por completo. Resultó que había tocado el mouse, y después de trastear un buen rato entendí el concepto de controlar la vista con el mouse. A partir de ahí el juego se volvió mucho más fácil.
    No había internet, ni mi amigo ni yo sabíamos sobre mirar con el mouse, y nunca habíamos visto a alguien jugar un FPS 3D de verdad. Hoy ese conocimiento está tan difundido que cuesta imaginar lo extraña y alienígena que era en ese entonces la interfaz de los juegos. Me alegra que el código fuente esté disponible.

    • Por si no lo sabías, este es el código fuente de la reedición de Quake II. El código fuente original de Quake II ya estaba publicado desde hace años[0], junto con varios clásicos más de id Software[1].
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • Me recuerda la primera vez que vi a varias personas jugando FPS en una LAN.
      Fue alrededor de 1999, en la ComicCon de Roma, Italia, justo cuando Half-Life acababa de entrar en gold master y se había publicado una demo multijugador. Al menos 20 personas estaban jugando Half-Life multijugador por LAN, todas usando también el mouse. Era una locura.
      Después fui a muchísimas LAN parties hasta 2005, pero el matchmaking online terminó matando QuakeNet y su cultura social.
  • Ah, qué nostalgia.
    En 1999, Quake II era el juego que jugaba; literalmente, casi el único. Le dediqué una cantidad enorme de tiempo a QII y escribí mi primer código haciendo mods.
    No es exagerado decir que Quake II me convirtió de usuario de computadoras en programador. Marcó el rumbo de mi vida adulta y de mi carrera.
    Al hacer mi primer mod aprendí cálculo vectorial, a entender una base de código existente y a integrar builds automáticos para probar rápido. También toqué un poco la creación de mapas y el arte 3D, pero pronto me di cuenta de que no era artista ni diseñador.
    En esa época no tenía ningún control de versiones ni política de backups, así que perdí todo el código original. El siguiente juego con el que me obsesioné de forma parecida fue Tribes 2, y el scripting y modding que permitía eran realmente increíbles.

    • Encontré el binario de mi mod entre un montón interminable de archivos.
      https://xn0.co/Xeno-Mod_1.9_Setup.exe
      ¡Obviamente todos en HN van a descargar y ejecutar un ejecutable de cualquier origen de internet! Pero si tienes el QII original y te da curiosidad, es seguro ejecutarlo.
    • Tribes 2 fue mi primera experiencia de modding, y ese juego también ocupa un lugar muy especial en mi corazón. Después, Sphere y RunUO, emuladores de Ultima Online, me convirtieron de gamer en programador.
    • Descubrir la consola desplegable fue como una revelación.
      Homenaje: http://guake-project.org/
  • Tremendo; me transportó directo a los 90. Más precisamente, estoy hablando del primer Quake.
    Tenía una PC en el piso de mi cuarto, creo que era una Pentium 166MMX, y un amigo trajo una máquina parecida, algo más rápida, como de 233. No teníamos tarjetas LAN.
    Usamos el viejo cable paralelo de mi padre para engañar a Windows y hacerlo creer que era una conexión LAN, y funcionó lo suficientemente bien como para jugar durante varios días. Luego nos aburrimos un poco y nos metimos en la escena de modding, aunque no creábamos nada nosotros: descargábamos cosas publicadas y las probábamos. Nunca voy a olvidar Girobot y KQP (Killer Quake Patch).
    Los bots de Girobot eran bastante fuertes, siempre que no se quedaran trabados en el terreno. La verdadera mina de oro era KQP, que agregaba todo tipo de mods, armas y sistemas de bots disparatados. La Vampire Gun hacía que el jugador alcanzado muriera deshaciéndose lentamente, pero no demasiado lento, en pedazos de carne, y me hacía reír a carcajadas cada vez. Extraño mucho los 90.

    • Cuando dices “Girobot”, ¿te refieres a Gyrobot[1], de “Gyro Gearloose”?
      Por cierto, entiendo que KQP también incluía ZeusBots.
      [1] https://github.com/Jason2Brownlee/QuakeBotArchive
    • Tenía 8 GB de mods, mapas y skins para el multijugador de Quake 2, descargados por módem y a veces por T1. Extraño muchísimo esos mods.
    • ¿El viejo cable paralelo de tu padre? ¿Lo conectaron como módem nulo? Usé la misma configuración con mi compañero de cuarto en la universidad, en nuestro departamento. Era mediados de los 90, así que jugábamos Doom 2 y los FPS de esa época; buenos recuerdos.
  • Vi a gente quejarse en otros lados de que la reedición no tiene versión para Linux, pero publicaron el código fuente así y dice que fue probado con clang. Un gran aplauso para id por mantenerse fiel a sus principios.

    • Me pregunto por qué publicaron este código fuente. No sé si fue puramente por principios o si había una obligación legal porque el código anterior también era GPL.
      Creo que, como el código anterior también era de su propiedad, no habrían tenido obligación legal.
    • Esta versión salió en todas las plataformas principales, y estoy bastante seguro de que hoy tanto Nintendo como Sony usan Clang/LLVM en sus toolchains de SDK. Puede que hayan tenido Linux en mente, pero creo que la motivación principal fue hacerlo compilar en consolas modernas.
    • Esto parece ser solo el código del juego, no el código fuente del motor. ¿Me estoy perdiendo de algo?
  • Hay demasiados juegos que ya no se venden y que no se ejecutan en stacks modernos de software y hardware.
    Me gustaría que existiera una ley que dijera que, si durante 20 años no publicaste parches para que un software funcione en nuevas plataformas, entonces, por su importancia cultural, deberías liberarlo como open source.

  • Me da curiosidad qué opinan sobre usar _t como sufijo de tipo en C/C++, como en este código fuente.
    Según entiendo, está reservado para tipos definidos por el lenguaje, pero nunca he visto una alternativa razonable. Sin el sufijo, el código a veces queda raro. Por ejemplo, para un tipo personalizado de “viewport”, creo que viewport_t viewport; es mejor que viewport viewport;.

    • Tengo entendido que eso es más una regla de POSIX que del lenguaje C en sí. De todos modos, lo uso en mi código personal, pero en los estándares de codificación con los que he trabajado a menudo estaba prohibido, incluso en entornos no POSIX.
      Normalmente no me importa tanto como para oponerme, así que nombro los tipos como lo pida la guía de estilo. El prefijo t es peor, y agregar la palabra completa typedef también es peor.
    • Según entiendo, quien reservó el sufijo _t fue POSIX, no C.
      Aun así, trabajando con la base de código de id Tech se me pegó la costumbre de _s/_t, y decidí que no me molestaba que mi base de código en C quedara marcada para siempre como “no compatible con POSIX”. Lo que sea que eso signifique en la práctica. En C++ simplemente uso InitialCamelCase.
    • No va a ser del gusto de todos, pero yo suelo usar CamelCase para los tipos y under_scores para las variables. Terminan apareciendo cosas como Viewport viewport;, pero al menos es fácil ver que Viewport es un tipo.
    • Cuando el IDE no ayudaba mucho, era útil si tenías que saber qué era cada cosa mirando solo el código frente a tus ojos.
    • La guía de estilo de C donde trabajo establece usar _type.
      Curiosamente, una base de código enorme de un producto embebido con un OS personalizado no usa tipos como uint32_t para enteros de ancho fijo. En su lugar, un header común de la empresa define uint32 y similares, sin el sufijo _t. No sé por qué se tomó esa decisión.
  • En mi época de crecimiento, este juego lo era todo para mí. Me presentó por primera vez a los clanes, los ladders y una verdadera cultura de juego online.
    Mi mapa era The Edge, y mis armas eran el railgun o el lanzacohetes. En ese entonces era conexión telefónica, así que era clave encontrar un servidor con buena latencia. Lo más molesto eran quienes usaban esa arma que causaba lag a todos.
    Sé que Q3 es un juego más grande que perfeccionó el género, pero mi favorito siempre será Quake 2. También tenía un single-player sólido y expansiones, y la sensación de velocidad era perfecta para mí. Con la llegada de Q3, todo se volvió demasiado rápido.

    • Puede que te gusten los servidores de Quake Live que usan físicas VQL.
      VQL se siente mucho más cercano a Q2, mientras que PQL está más cerca de CPMA o QuakeWorld. Como bonus, The Edge también se puede jugar en Quake Live.
    • Le das con el railgun y rematas con la ametralladora, gg
  • Si eres fan de Quake 2 y tienes acceso a un Oculus Quest 2, te recomiendo probar Quake2Quest. Se siente realmente distinto correr en persona por esos mapas en los que pasé tantísimo tiempo antes.