Celeste Classic para Spectrum Next
Publicado: 16 Feb 2024, 19:10
Hola, he publicado un remake para Spectrum Next de Celeste Classic. Lo podeis descargar gratis desde este enlace:
https://davidprograma.itch.io/celeste
He intentado hacer una recreación precisa y creo que lo he conseguido, es tan divertido (y difícil) como el original.
Se juega mejor con mando; y aunque yo siempre he sido de teclas, en esta ocasión prefiero un viejo gamepad de Megadrive con sus diagonales superprecisas.
Como de costumbre, he incluido el un paquete con el emulador CSpect de Mike Dailly para los que no tengais Next (o no os apetezca sacarlo del cajón)
Y ahora algunos detalles técnicos para el que le gusten... He tardado 7 semanas en hacer el desarrollo. Primero hice un prototipo en Godot en 5 días para hacerme una idea de si la cosa era factible e identificar posibles problemas u obstáculos. Después ya me puse con el Next, programando en C con el Z88DK.
Lo que más me preocupaba era la precisión numérica... Pico-8 usa Lua, donde todos los números son floats y la precisión no es problema. La física tenía que funcionar igual (el moñeco tiene que saltar lo mismo, y llegar igual de lejos). Por suerte, utilizando enteros de 16 bits (usando punto fijo 8.8) la cosa funciona bastante parecida, aunque hay que tener cuidado con los rangos de operaciones (overflow/underflow) y las constantes que son aproximadas. Algunas divisiones las he tenido que aproximar con divisiones por potencia de 2 (para poder usar rshift que es lo barato en el z80).
Con la física del moñeco funcionando (y las colisiones), ya ha sido trabajo metódico de ir incluyendo todas las pijaditas que tiene el juego (nieve, humo, plataformas de salto, globos, fresas, plataformas deslizantes, llaves, cofre, etc). Y según me iba quedando sin memoria (tengo 30Kb para la zona común de código), ir enviando cosas a memoria paginada (que se puede hacer, pero tiene sus problemas). Lo bueno del Next es que se puede paginar RAM en los primeros 16Kb de espacio de direcciones (0000 - 3FFF), utilizando los segundos (4000-7FFF) para gráficos (tileset, tilemap) y los últimos 32K (8000-FFFF) para código común (desde donde se llama al código paginado).
Por último me puse con la música y los efectos de sonido, utilizando Arkos Tracker 2 y haciéndome un turbosound de andar por casa (de los 3 AYs del next, uno con sus 3 canales para música, y otro para efectos de sonido).
Los últimos días los dediqué a depurar problemas que no se manifestaban en el emulador, sino únicamente en la máquina real (en el emulador el acceso a disco es rápido y jamás tuvo interactuó con la interrupción que uso para la música). Pero en la máquina real he tenido crashes debido a que las escritura tardan (guardo puntuaciones y teclas redefinidas).
En total ha quedado un ejecutable monolítico de menos de 200kb. Podría haber comprimido los niveles pero no me he querido liar.
https://davidprograma.itch.io/celeste
He intentado hacer una recreación precisa y creo que lo he conseguido, es tan divertido (y difícil) como el original.
Se juega mejor con mando; y aunque yo siempre he sido de teclas, en esta ocasión prefiero un viejo gamepad de Megadrive con sus diagonales superprecisas.
Como de costumbre, he incluido el un paquete con el emulador CSpect de Mike Dailly para los que no tengais Next (o no os apetezca sacarlo del cajón)
Y ahora algunos detalles técnicos para el que le gusten... He tardado 7 semanas en hacer el desarrollo. Primero hice un prototipo en Godot en 5 días para hacerme una idea de si la cosa era factible e identificar posibles problemas u obstáculos. Después ya me puse con el Next, programando en C con el Z88DK.
Lo que más me preocupaba era la precisión numérica... Pico-8 usa Lua, donde todos los números son floats y la precisión no es problema. La física tenía que funcionar igual (el moñeco tiene que saltar lo mismo, y llegar igual de lejos). Por suerte, utilizando enteros de 16 bits (usando punto fijo 8.8) la cosa funciona bastante parecida, aunque hay que tener cuidado con los rangos de operaciones (overflow/underflow) y las constantes que son aproximadas. Algunas divisiones las he tenido que aproximar con divisiones por potencia de 2 (para poder usar rshift que es lo barato en el z80).
Con la física del moñeco funcionando (y las colisiones), ya ha sido trabajo metódico de ir incluyendo todas las pijaditas que tiene el juego (nieve, humo, plataformas de salto, globos, fresas, plataformas deslizantes, llaves, cofre, etc). Y según me iba quedando sin memoria (tengo 30Kb para la zona común de código), ir enviando cosas a memoria paginada (que se puede hacer, pero tiene sus problemas). Lo bueno del Next es que se puede paginar RAM en los primeros 16Kb de espacio de direcciones (0000 - 3FFF), utilizando los segundos (4000-7FFF) para gráficos (tileset, tilemap) y los últimos 32K (8000-FFFF) para código común (desde donde se llama al código paginado).
Por último me puse con la música y los efectos de sonido, utilizando Arkos Tracker 2 y haciéndome un turbosound de andar por casa (de los 3 AYs del next, uno con sus 3 canales para música, y otro para efectos de sonido).
Los últimos días los dediqué a depurar problemas que no se manifestaban en el emulador, sino únicamente en la máquina real (en el emulador el acceso a disco es rápido y jamás tuvo interactuó con la interrupción que uso para la música). Pero en la máquina real he tenido crashes debido a que las escritura tardan (guardo puntuaciones y teclas redefinidas).
En total ha quedado un ejecutable monolítico de menos de 200kb. Podría haber comprimido los niveles pero no me he querido liar.