Carra eres el crack del subforo, ojalá tener esa fuerza de voluntad de coger un proyecto y tirarlo para adelante sin descanso. Te está quedando todo de puta madre y te estás pegando un currazo. Muchísimo ánimo y sigue así tío.
Estos días he vagueado bastante, pero también he estado haciendo algunos progresos para el futuro prototipo físico de la consola.
Aquí os los cuento:
Antes de seguir con otras de las tareas más "grandes" me apetece hacer un juego pequeño. Uno que me gustaría tener es el típico juego Mahjong de hacer parejas, que debería ser sencillo de hacer. De momento encontré en itch.io un tileset con licencia libre que me gustó y lo he adaptado a la resolución de la consola. He tenido que hacer bastante edición a mano pero creo que ha quedado bastante bien, aquí lo tenéis.
Llevaba ya un tiempo sin poner nada. La verdad es que he estado bajo de motivación, y el juego del mahjong me ha estado dando más problemas de los que pensaba. Pero no puedo dejar esto así ahora que los demás también están abriendo devlogs jaja. Así que aquí tenéis un poco de progreso:
Aunque queda bien, si os fijáis vais a ver que hay problemas en varios sitios con el dibujado de los bordes y las sombras de las tiles. Seguramente tendré que cambiar de sistema. Pero por lo menos ya tengo montado todo el código para tratar con los diferentes layouts.
Ya he podido arreglar los problemas gráficos. Aún no es jugable pero se va acercando: ya he añadido un control con cursor, como si fuera un ratón (pero que se maneja con la cruceta, claro) para que nos sea fácil elegir las tiles visualmente. Lo podéis ver aquí:
No sé si se aprecia en el GIF pero también he resaltado los bordes de las tiles (superior y derecho) cuando hay un desnivel por el lado donde no vemos los cantos. Antes me pareció que no siempre se distinguía bien.
Cada vez que publicas un minijuego para tu consola me quito el sombrero. Sigue así y ya avisas cuando se pueda comprar ^^
El juego ya es jugable, y ya tiene la pantalla de título y el menú para elegir tablero.
Le va quedando poco...
Al final he tenido que hacer algo que no había previsto, y es montar un sistema para asegurar que los tableros que te salgan siempre se puedan resolver. Esto requiere mucha lógica adicional (por ejemplo programar un solver), pero la verdad el juego gana mucho con ello. Si no, en algunos tableros era muy difícil que te saliera algo resoluble.
#669 Yo una vez hice un juego de este estilo para un cliente y la lógica que seguí fue preparándolo al reves. Me hice hasta piezas recortadas en papel para montar los tableros y asegurarme que eran resolubles. Lo que hice para dar variedad, fue cambiar aleatoriamente los numeros de las piezas, pero manteniendo la posición de las parejas.
También puse un sistema para si aún así no tenía solución, se eliminaran parejas hasta que quedara una pareja posible para seguir jugando.
#670 Pensé en un sistema así pero no me gustaba la idea de que la secuencia de parejas siga siempre los mismos movimientos.
En vez de eso hice lo siguiente: primero barajeas las tiles al azar. El solver encuentra todas las parejas posibles (esta función se reutiliza también para dar pistas), y las elimina. Repite este ciclo hasta resolver el tablero y si en algún caso se queda sin parejas lo que hace es "fabricar una": toma una tile seleccionable, le busca una posible pareja, y la intercambia con otra de las tiles seleccionables.
Aunque bueno esto lo veréis también en el código fuente claro.
Detecté un bug en mi emulador, así que he creado una versión nueva (v23.6.4) para corregirlo.
Con factores de escalado grandes no se estaba haciendo correctamente el sampleo de los pixels, y al agrandarlos hacía que tuvieran un tamaño incorrecto: se "comía los bordes", como podéis ver en esta comparativa.
He creado un nuevo programa de test para probar esto, que es de donde he sacado estas imágenes. Posiblemente edite también un poco la especificación de la GPU para que queden claros todos los casos (recordad que uno de mis objetivos con Vircon32 es que su comportamiento sea totalmente documentado y reproducible).
Hola compañero, he visto que desde la web, cuando vas al link para el kit de desarrollo, no te lleva a la última release de github. Quizás deberías hacer que te llevase a la lista de releases, así te puedes asegurar de que la gente descarga la última.
Me quedo por aquí que me interesa el tema. Felicidades por el curro.
EDIT: Perdona por el retraso, pensaba que el devtools tenía la misma versión que el emulador. Estoy echándole un ojo a todo
Ha llevado algún tiempo, pero ya está terminado el juego de Mahjong para Vircon32.
Como siempre, lo podéis bajar en la web, y el código lo tenéis en GitHub.
Creo que lo he pulido bastante. Tiene 4 tableros a elegir, y siempre se pueden resolver.
Además podemos pedir pistas y tenemos deshacer y rehacer.
Aquí tenéis un video de gameplay para ver la pinta:
Ya comenté en algún momento que me gustaría hacer un port del emulador de Vircon32 a Libretro. Esto permitiría jugar a la consola de manera sencilla en frontends conocidos, como Retroarch, RetroPie, RecalBox o Kodi (entre otros). Jugar a Vircon32 en esos sistemas sería solo añadir el core y descargarse algunas roms.
Estos días, después de muchas pruebas, conseguí al fin armar un pequeño core de ejemplo que usa OpenGL a través de la interfaz de Libretro. Esto era lo que más me bloqueaba por el momento ya que otras cosas como el audio o el input parecen ser sencillas. Ahora ya puedo ponerme a intentar organizar el port. Aunque me va a llevar bastantes horas creo que merecerá la pena para hacer más accesible la consola.
#676 emscripten no soporta emulación completa gl, con gles creo que se podría sacar un port del emulador para navegador web.
#679 Sí, la versión simplificada elimina todo excepto el núcleo de la emulación.
De todas formas todos estos casos se podrían resolver con un cambio en la arquitectura del emulador que estoy analizando ahora, al hilo del port a libretro. Ahora mismo en el emulador se entrelazan la lógica interna de la consola con las librerías de video y audio, la interfaz gráfica, timing, logs, etc. Lo que voy a intentar es aislar toda la lógica de la emulación en sí, y que ese código funcione como un proyecto aparte (una DLL). Esa DLL tendrá una serie de interfaces para comunicarse y poder realmente dibujar en pantalla, reproducir sonido, etc. Pero ya será una lógica "agnóstica", independiente de cómo implementemos esas funciones (OpenGL + OpenAL? DirectX? GLES? Implementaciones por software? ...).
Después, para armar un emulador completo enlazamos esa lógica de la consola tal cual (sin tocarla) con las librerías concretas. Esto puede hacer más fácil los diversos ports (libretro, navegador, móviles...).
Hace algún tiempo que no pongo nada. Ahora mismo no tengo nada para enseñar, pero escribo para que sepáis que no lo he abandonado . Sigo trabajando en remodelar el emulador de la consola. El código en el repositorio cambiará bastante: además del cambio de la arquitectura en sí estoy aprovechando para mejorar otras cosas: mejorar nombres de archivos, de clases, poner la consola en un namespace propio... También es posible que después del cambio ya no sea necesario el "emulador simplificado" que hice, estando la lógica de la consola ya aislada.
En resumen, es una de esas épocas en la que hago trabajo del que no se ve.
Remodelando el emulador acabo de encontrar y corregir un error en mi código. Algunas veces, al hacer una escritura incorrecta en un puerto, la operación sólo se estaba ignorando, pero no rechazando. Es decir: debería activarse un error de hardware, pero en cambio el programa continuaba. Esto no afecta a ningún juego ni programa, pero nos puede ser útil para detectar mejor los errores al programar (ahora la BIOS nos avisará del error, antes simplemente no pasaba nada).
Bueno, tras muchos cambios en el código por fin está ya remodelado el emulador. La lógica de la propia consola está ahora aislada del resto. En el repo veréis una carpeta nueva llamada ConsoleLogic:
El código de esta carpeta se compila primero de forma independiente para crear una librería. Y después el emulador la utiliza llamando a sus funciones y respondiendo a sus peticiones (callbacks). La arquitectura del emulador antes mezclaba la lógica de la consola con el resto (audio, video, eventos...). Tras los cambios queda una arquitectura mucho más modular, que podéis ver en este diagrama.
Gracias a los cambios, la propia lógica de la consola no tiene ninguna dependencia (es C++ puro) y debería ser muy sencillo compilarlo en cualquier sistema. Además, como el resto de partes están aisladas, será mucho más directo hacer un emulador de Vircon32 con otras librerías. Por ejemplo, si alguien fuera a hacer una versión para XBox podría cambiar los módulos de audio y video para usar DirectX en vez de OpenGL + OpenAL.
Y con esto ya podré empezar a intentar crear el core de Vircon32 para libretro.
Bueno, en su día ya me hice un par de pruebas sencillas para crear un core en libretro (sistema que usan retroarch, retropie y similares). Y entre eso y tener ya el emulador modular, ha sido más fácil de lo que pensaba empezar a tener algo funcional. Aún le tendré que dar bastantes vueltas y corregir muchas cosas, pero como veis es muy buen comienzo.
Ahora, como todo el mundo, el mes de agosto estará más complicado y no sé cuándo lo voy a poder continuar pero ya tenéis un adelanto
Acabo de publicar una versión actualizada del Solitario. Era demasiado difícil ganar la partida, así que he incluido un menú para elegir dificultad. Ahora podemos robar 1, 2 o 3 cartas cada vez (como en el solitario de Windows) para poder hacer el juego más fácil.
También he cambiado la música de gameplay por otra. Las partidas de solitario pueden durar varios minutos, y la música anterior se hacía demasiado repetitiva. La nueva música es más tranquila y con volumen más suave para evitarlo.
Además de esto también he arreglado un pequeño error en el juego JellyFish, de TheR. La puntuación máxima no se estaba leyendo y guardando bien desde la tarjeta de memoria, y la puntuación se podía perder entre sesiones.
EDIT: He hecho un video contando esto mismo (en inglés, pero hay subs en español)
Creo que he terminado el núcleo de Vircon32 para RetroArch. He subido el código a un nuevo repositorio. Ahora estoy en el discord de esta gente para ir viendo el tema de integrar mi núcleo en el sistema de build de retroarch y que ya se pueda descargar automáticamente desde el front-end como los demás.
Y por cierto, al jugar Vircon32 desde retroarch tenemos acceso a algunas cosas chulas, como por ejemplo poner filtros gráficos tipo scanlines o televisores antiguos como este:
PD: Si no lo veis al tamaño original no se aprecia mucho el efecto
He estado indagando en tu web y me parece una flipada el curro que le has metido a esto @carra
¿Ya tienes peña que se haya animado a hacer juegos para la consola? Me parece la leche, en serio.
He estado leyendo últimamente sobre Wolfenstein 3D, y DOOM y demás. ¿En teoría para tu consola también se podrían hacer cosas con un 3d como ese no?
#689 hubo una game jam de vircon aquí y para más inri yo hice lo que tu comentas. Factible pero se queda un poco corta de potencia.