- Hypersomnia es un shooter multijugador impulsado por la comunidad que permite duelos con amigos o combates entre dos clanes, y que tiene juego en línea disponible desde 2017
- Está escrito en Modern C++ y se implementó sin motor de juego; se ofrece como un juego gratuito y open source
- La composición del juego combina las tácticas de Counter-Strike, el dinamismo de Hotline Miami y la nostalgia del pixel art de los RPG de la vieja escuela; actualmente ofrece 24 armas únicas, 10 mapas de la comunidad y dos modos: Bomb defusal y Gun game
- Las vías de distribución son jugar en el navegador, Steam, Windows, Linux AppImage y macOS dmg; al iniciar el juego se ejecuta un interactive Tutorial
- El servidor puede ejecutarse con Server Docker o Headless AppImage, y todos los archivos están firmados digitalmente con una ruta provista para verificar la firma
- El editor de mapas integrado es 100% WYSIWYG y permite trabajar directamente en el mundo del juego; está hecho con ImGui y usa un formato de mapas JSON
- Si se pegan carpetas PNG, WAV u OGG en el directorio del mapa, el juego las reconoce automáticamente
- Si se arrastra y suelta un GIF en la escena, funciona de inmediato como animación dentro del juego
- El mapa en el que se está trabajando puede probarse con un solo clic, y los clientes conectados descargan automáticamente la versión actual del mapa y los recursos personalizados
- El servidor, el juego y el editor están dentro del mismo ejecutable en todos los sistemas operativos, por lo que es posible iniciar una sesión desde el editor, interrumpirla con ESC y volver al estado original
- El networking se basa en determinismo de simulación multiplataforma y funciona de forma 100% determinista entre el cliente de navegador, los clientes nativos de Windows, Linux y macOS, e incluso builds ARM nativas
- En lugar de enviar continuamente por red el estado de todos los objetos, solo se transmiten las entradas de los jugadores y el resto lo simula cada cliente localmente
- Para lograr determinismo en los cálculos de punto flotante, se usa
clangen todos los sistemas operativos, se aplica/fp:stricten builds de Windows y-ffp-model=stricten builds ARM, y funciones matemáticas comostd::sinystd::sqrtse reemplazan por implementaciones de la familia STREFLOP - En un ejemplo con dos personajes controlados por jugadores, con un tickrate de 60 Hz, el tráfico es de aproximadamente
40 kbit/s (= 5 KB/s), y solo los personajes controlados por jugadores contribuyen al tráfico de red
- El cliente de navegador y los clientes nativos pueden jugar juntos en el mismo servidor gracias a libdatachannel y datachannel-wasm
- Se puede alojar un servidor desde el navegador y conectarse con un cliente nativo, o abrir un servidor desde un cliente nativo y enviar un enlace de acceso para el navegador
- La versión de navegador admite inicio de sesión con Discord, partidas clasificatorias y global Leaderboards; al vincular una cuenta de Discord con una cuenta de Steam, la versión de Steam y la versión web comparten el mismo rating
- rectpack2D, escrito para empaquetado de texturas, se usa en Assassin's Creed: Valhalla, en una empresa fabricante de drones y en dos artículos científicos
- La implementación del pool de memoria ofrece almacenamiento contiguo, asignación O(1), liberación O(1), desreferenciación O(1), expansión automática y comportamiento determinista; al enviar el estado inicial del mundo, incluye incluso el estado interno del pool de objetos del juego para que el cliente pueda simular de forma determinista los mismos identificadores de objetos y el mismo orden de memoria
- El self-updater integrado descarga y aplica actualizaciones automáticamente; verifica, mediante una llamada a
ssh-keygen, que la actualización provenga de la clave pública de desarrollador hardcodeada, y si el hosting de builds fuera hackeado y se subiera una versión maliciosa, los clientes existentes rechazarían aplicar la actualización
1 comentarios
Opiniones de Hacker News
Me preguntaba si la aritmética de punto flotante no estaba completamente especificada, pero debería haber buscado primero: https://stackoverflow.com/questions/49471943/floating-point-...
No es algo que se resuelva con una sola instrucción
sqrt; se empieza con una aproximación de Taylor y luego se refina la respuesta ejecutando varias veces el método de Newton, y ahí aparecen decisiones como el grado de la serie de Taylor, el punto central y la cantidad de iteraciones.IEEE 754 puede regular la multiplicación, pero para
sqrt,sin,cosytanhay que decidir cómo calcularlas, y normalmente esa implementación está en la biblioteca estándar que proporciona el compilador.Además, en punto flotante no se cumple la asociatividad:
(a+b)+c != a+(b+c), así que con solo cambiar el orden de las operaciones básicas los resultados pueden divergir.El método de redondeo puede variar entre arquitecturas, y si se mezclan arm/amd/intel existe la posibilidad de obtener comportamiento no determinista: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
Este juego parece usar una implementación de punto flotante por software para evitar ese problema, y si además se suma un compilador unificado, parece que puede librarse de la mayoría de los problemas.
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
En C y en varios otros lenguajes, operadores comunes no se mapean explícitamente a operaciones concretas de punto flotante, así que el compilador tiene mucho margen de maniobra.
También se usa en cierta medida estado global invisible, como el modo de redondeo; si no recuerdo mal, DirectX solía cambiar flags por detrás.
-marchlos resultados pueden variar bastante.Solo que no eran open source; eso no significa que esto no sea un logro. En realidad es algo realmente difícil.
[0] https://springrts.com/
La diferencia aquí es que los juegos RTS no usan física determinista de punto flotante, así que Hypersomnia necesitaba una solución nueva.
Llenó el vacío que dejaron TA y SupCom, y SupCom 2 era un RTS casual y más pequeño bastante bueno por sí mismo, pero no estaba a esa altura.
Y de PA mejor no hablamos.
BAR también se ve bastante prometedor: https://www.beyondallreason.info
No es que el juego en sí haya sido incluido en AC:Valhalla, sino que se incluyó una biblioteca de empaquetado de texturas creada durante el desarrollo[1]. Por supuesto, no intento restarle mérito a ese logro; eso por sí solo daría para un artículo.
También me parece un poco exagerado decir que fue el origen del sistema ECS usado en Unity. Antes de 2010 ya había usado motores de juego con ECS, y en el ámbito de los motores de juego parece venir de Operation Flashpoint[2].
[1] https://github.com/TeamHypersomnia/rectpack2D
[2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
Algún día, cuando tenga tiempo, quizá después de jubilarme, me gustaría hacer algo así, y es muy probable que proyectos como este sirvan como material de aprendizaje para entrar en ese mundo.
Me recuerda a ARC de fines de los 90, es decir, Attack Retrieve Capture, que hoy apenas se mantiene como Armor Critical.
https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
http://armorcritical.com
Me da curiosidad saber qué otros trabajos comerciales han hecho para mantener el proyecto, si hay planes de lanzarlo en Steam y cómo afecta el mundo persistente al gameplay.
También me intriga cómo se ve para los jugadores existentes la técnica ingeniosa de reconstruir el estado físico cuando entra un jugador nuevo. Por ejemplo, si se mueven las posiciones de las balas.
También invertí bien mis ahorros, así que pude concentrarme por completo en Hypersomnia.
Me gustaría lanzarlo en Steam antes de 2024
Por ahora no hay ningún mundo persistente; solo se mencionó a modo de teaser una dirección posible si el juego tiene éxito
La reconstrucción de la física no debería mover ninguna posición. Lo que se reconstruye son solo estados “calientes”, como contactos o árboles, y ese estado solo importa en el momento de avanzar la simulación de un estado al siguiente, así que no afecta el renderizado posterior
El único impacto que podría tener para los jugadores existentes sería una caída puntual de frames si el mundo físico que se va a reconstruir es enorme, pero en la práctica todos los mapas todavía son pequeños y encajan mejor con partidas 3v3
En segundo lugar, encontré un bug grande en MacOS. En la pantalla de pausa/configuración, la entrada del mouse queda muy desalineada, al punto de que ni siquiera puedo hacer clic en las opciones del menú principal
Reuní captura de pantalla, logs y reporte del sistema: https://youtu.be/O4OoMdeFAt0
Casi siempre juego en Windows y Linux, así que no he probado MacOS durante mucho tiempo; voy a ver si puedo arreglarlo
En particular, eran textos sobre ECS y networking
Me alegra ver que haya avanzado tanto
En el README enlacé un blog post importante de Glenn Fiedler al explicar la arquitectura determinista, pero yo no soy esa persona; si di lugar a una confusión, no era mi intención
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)