Página 1 de 8

Nightmare on Halloween

Publicado: Mar, 22 Oct 2013, 23:48
por radastan
Bueno, el tileset está casi terminado, me quedan 13 tiles por completar de los 48, pero aquí tenéis un pequeño adelante de cómo está quedando y un buen ejemplo del motivo de usar el tileset ampliado.

Y es que 48 tiles ya es otra cosa, las pantallas lucen muchísimo más y me puedo permitir vilguerías como escenarios de fondo (las montañas, la Luna, etc).

Por cierto, el título también es definitivo, al igual que el marcador. Si, llevarás a un esqueleto en busca de su último testamento y voluntad, cuyas páginas se han diseminado por Transilvania.

Re: Nightmare on Halloween

Publicado: Mié, 23 Oct 2013, 00:09
por son_link
Tiene buena pinta el juego :mrgreen:

Re: Nightmare on Halloween

Publicado: Mié, 23 Oct 2013, 07:50
por na_th_an
Sí que mola, sí. Me gusta mucho el ambientillo :)

Re: Nightmare on Halloween

Publicado: Mié, 23 Oct 2013, 11:07
por D_Skywalk
El mío si me da tiempo es de una niñita que se ve atrapada en halloween en una casa encantada!

Me gustaría probar eso de la paginación, hay algún juego que lo use y que me valga de ejemplo?
Mi idea es que cada planta, tenga variaciones en el tileset. Estoy probando con vista genital, pero sino volveré a la normal ;)

Otra pregunta es si sería muy complejo hacer que al pasar el juego cargue la pantalla final, en lugar de tener que meter el ending... y si no lo que haré es que el final se monte con un tileset...

Un Saludo chicos! :)

Re: Nightmare on Halloween

Publicado: Mié, 23 Oct 2013, 11:14
por radastan
Chato, emplea el tileset extendido, que son 48 tiles y eso da de sobra para un juego de plataformas como ves.

Ni paginación ni gaitas.

Otra cosa es que uses más de 24 pantallas, entonces lo mismo te quedas corto de memoria.

Re: Nightmare on Halloween

Publicado: Mié, 23 Oct 2013, 11:37
por na_th_an
$this->bbcode_second_pass_quote('D_Skywalk', 'E')l mío si me da tiempo es de una niñita que se ve atrapada en halloween en una casa encantada!

Me gustaría probar eso de la paginación, hay algún juego que lo use y que me valga de ejemplo?
Mi idea es que cada planta, tenga variaciones en el tileset. Estoy probando con vista genital, pero sino volveré a la normal ;)

Otra pregunta es si sería muy complejo hacer que al pasar el juego cargue la pantalla final, en lugar de tener que meter el ending... y si no lo que haré es que el final se monte con un tileset...

Un Saludo chicos! :)


Adaptar el motor tal cual para poder usar paginación y copiar nuevos datos sobre los que hay es sencillo si sabes cómo funciona la paginación (básicamente, sigues teniendo 48K, pero los últimos 16K los puedes "cambiar" por otra página; en principio está la 0, pero puedes poner cualquiera de las otras siete - el problema es que todo splib2 funciona justo en la página 0, por lo que hay que paginar, copiar, y volver a colocar la 0 antes de seguir).

El tema es tener en alguna página de RAM extra los datos extra que necesites y, cuando los vayas a usar, paginar la RAM extra, copiar los datos al buffer de RAM baja (por ejemplo, los 2304 bytes del tileset desde $C000 hasta la dirección de "tileset"), y luego volver a paginar RAM 0 para que el juego pueda seguir funcionando.

Esto es: la RAM extra funciona como un almacén. Se pueden meter mapas, tiles, sprites, o incluso pantallas comprimidas. Se puede almacenar todo comprimido si se modifica la función unpack para que pueda descomprimir desde otras páginas de RAM (siguiendo el mismo método: paginar RAM n, descomprimir (el destino tiene que estar en RAM baja), paginar RAM 0).

Ahora mismo estamos trabajando en un güego que usa la RAM extra para almacenar niveles completos comprimidos (o sea: tileset + spriteset + mapa + enemigos + hotspots). Para ello hemos hecho las adaptaciones necesarias para que esto sea fácil de hacer, y hemos escrito una aplicación conversora que se encarga de convertir todo el material (mapa.map, enems.ene, work.png, font.png, y sprites.png, junto con datos de cabecera) a un binario listo para comprimir y meter en una página de RAM. El tema funciona guay: en config.h defines MAP_W y MAP_H para que te den un tamaño de mapa digamos "máximo", y luego cada nivel puede tener las dimensiones que se quiera siempre que no exceda el número de pantallas MAP_W * MAP_H. El script es común para todas las fases, pero puedes detectar en qué fase estás con un IF LEVEL=n. Además sustituye beeper.h y music.h por el replayer de WYZ para tocar música y efectos por AY, que también va en su propia página de RAM, liberando aún más espacio.

El problema es que ahora mismo está "feo" y hasta que no lo ponga bonico no podré sacar una nueva versión de la Churrera con esto para que se pueda usar. En cuanto lo tenga probado, requeteprobado, maqueado, y lo suficientemente automatizado, lo sacaré.

Mientras tanto, todo el proceso se basa en dos funciones muy sencillas. La primera coloca la página que le pases en el registro "b". La segunda, es el unpack adaptado para descomprimir desde otras páginas de RAM... Todo muy sencillo. Con algo de maña...

Esto hay que colocarlo bien visible en algún lugar del código. Al principio mejor, para que caiga en RAM baja (por debajo de $C000):

$this->bbcode_second_pass_code('', 'void SetRAMBank(void) {
#asm
.SetRAMBank
ld a, ($5b5c)
and f8h
or b
ld bc, $7ffd
ld ($5b5c), a
out (C), a
#endasm
}')

Y luego tenemos que añadir esta nueva función a aplib.h, que permite especificar la página de donde hay que copiar:

$this->bbcode_second_pass_code('', '
extern unsigned char ram_page [];

#asm
._ram_page
defb 0
#endasm
void unpack_RAMn (unsigned char n, unsigned int address, unsigned int destination) {
ram_address [0] = address;
ram_page [0] = n;
ram_destination [0] = destination;

#asm
di
ld a, (_ram_page)
ld b, a
call SetRAMBank

ld hl, (_ram_address)
ld de, (_ram_destination)
call depack

ld b, 0
call SetRAMBank
ei
#endasm
}
')

Así, si por ejemplo tenemos un tileset de 2304 bytes comprimido en RAM 3, a partir del principio de la página (o sea, en $C000), podremos sustituir en un momento dado el tileset que se está usando por el nuevo con un sencillo:

$this->bbcode_second_pass_code('', 'unpack_RAMn (3, 0xc000, (unsigned int) (tileset));')

El tema coñazo es hacerse la cinta que cargue los binarios necesarios en las páginas de RAM extra correctas... Y es aquí donde estoy trabajando para automatizar bien el proceso.

Re: Nightmare on Halloween

Publicado: Lun, 28 Oct 2013, 08:53
por radastan
Bueeeeno, tras un fin de semana intenso sólo me queda poner los enemigos en su sitio, la melodía, y la imagen del final. Todo lo demás está terminado y comprobado, hasta me he permitido el lujo de revisar el mapa jugando sin enemigos (encontré un par de defectos tontos).

Los 48 tiles ya los tengo bajo control, me ha bastado cambiar lo del "packed" en dos sitios (¿os habéis fijado que se hace en el make nuevamente cuando no hace falta?) y ajustando la línea de config que aclara que voy a usar un mapa sin packear.

Una gozada usar 48 tiles, oiga, nada que ver con los 16. Los mapas ocupan el doble, si, pero es que lo que se gana en vistosidad y variedad de escenarios merece la pena. He quitado el tile movible y estoy entorno a los 33 Kb en total (sin pantalla de carga)... vamos, espacio de soooooobra para un final digno y una melodía que no sea minimalista al comienzo.

A ver si hoy le doy el empujón refinitivo para que no me pille el toro, me gustaría tenerlo mañana listo para sacarlo el Jueves con tranquilidad.

Re: Nightmare on Halloween

Publicado: Lun, 28 Oct 2013, 09:02
por na_th_an
Lo puse en el make porque por lo general siempre hay algo que arreglar en el mapa, y es más cómodo tenerlo ahí y no tener que estar copiándotelo a mano :)

Ya estoy deseando verlo :D

Re: Nightmare on Halloween

Publicado: Lun, 28 Oct 2013, 10:18
por radastan
En honor a Erbe...

Re: Nightmare on Halloween

Publicado: Lun, 28 Oct 2013, 10:23
por na_th_an
JEJEJE mola :D