PSS (NES); 20151214

Lo que tenía para hoy, en principio, tenía que ver con el tema de la camiseta que aparece cuando el jugador se da contra un enemigo o los pinchos y pierde la ropa.

Es necesario programar tres comportamientos diferentes según el tipo de juego:

  • Modo 1P – Aparece una camiseta en un punto random.
  • Modo 2P_COOP – Aparece una camiseta en un punto random. Puede haber dos camisetas. Sólo se puede coger una camiseta si no tenemos ropa.
  • Modo 2P_VS – Aparece una camiseta en un punto random. Sólo aparece una. Se puede coger en cualquier momento.

Creo que puedo generalizar y hacer 1P y 2P_VS básicamente con el mismo código (salvo por la colisión extra). No tener a los jugadores en un array es un coñazo, pero ha sido un sacrificio necesario para tener esto funcionando en NTSC a 60Hz.

La camisetas sí las tendré en un array, si no la liamos ya con las combinaciones.

~~

Bueno, a falta de probar un poco más las camisetas están metidas con código mínimo. Soy bueno 😀

Ahora voy a controlar que acabamos la fase.

~

He metido millones de cosas, pero ahora, por alguna razón, cuando golpean a [PERSONALE] y tiene que aparecer la camiseta, se cuelga. Sin ningún motivo aparente…

Es en la llamada a clothes_move. Se furriña todo, no lo entiendo. No hago más que contar los metasprites que mando al mixer y siempre suman 19. No sé qué se me estará escapando.

Voy a descansar de esto, tanto cococrash se me atraganta XD

~~

He visto, mirando guarripeichimente, que cuando toco a un enemigo el número de sprites enviados al mixer se incrementa en 2.

¿Qué es lo que no estoy controlando?

~~

¡Poniendo marcas veo que los dos sprites de los enemigos activos están repetidos! Y además de salir intercalados, las coordenadas salen incrementadas en la segunda copia. Es como si se ejecutase de nuevo el bucle.

Esto suena a variable global reutilizada 😀

~~~

Eso va a ser. Clothes_create utiliza gpit, que es con la que se itera en los enemigos. Debería ir cambiando esto :*)

~

Esto está arreglado. Ahora voy a ver un par de detalles que no molan:

  • No detecta bien qué camiseta tiene que consumir si hay dos (siempre consume la primera) -> revisar en player.h. / BAH, estaba poniendo || en vez de |. Vaya patato estoy hecho.
  • La función que actualiza el tile durante VBLANK no está poniendo bien los atributos (no los está poniendo, vaya) -> revisar en printer.h / NO, lo está haciendo bien, lo que pasa es que soy tonto y me he confundido de paleta.

~~~~

Ahora no tengo ganas de rayarme, y hay cosas que tengo que diseñar, como los marcadores, que ya va siendo hora de que salgan.

En los modos de 1P / 2P_COOP / 2P_VS las cosas que salen en el marcador son levemente diferentes. Voy a hacer aquí una lista para orientarme…

Tengo que añadir una puntuación (no sé para qué).

Según he visto en otros juegos, se deja una linea vacía arriba del todo incluso en NTSC (2 en PAL) por temas de teles comilonas.

Modo 1P

  • Vidas
  • Tiempo restante
  • Total de monedas (acumulado)
  • Level (piso/pantalla)
  • Score
0               1
0123456789abcdef0123456789abcdef
1UP=XX    TIME=XX    COINS=00XXX
LEVEL=XX/YY          SCORE=ZZZZZ

Modo 2P Cooperativo

  • Vidas [PERSONAJE_1], Vidas [PERSONAJE_2]
  • Tiempo restante
  • Total de monedas (acumulado)
  • Level (piso/pantalla)
  • Score
0               1
0123456789abcdef0123456789abcdef
1UP=XX  SCORE=ZZZZZ  COINS=00XXX
2UP=YY  SCORE=ZZZZZ      TIME=XX

Modo 2P vs

  • Monedas recogidas por [PERSONAJE_1]
  • Monedas recogidas por [PERSONAJE_2]
0               1
0123456789abcdef0123456789abcdef
1UP COINS=XX            TIME=XXX
2UP COINS=YY

Asín va a caer. Voy a hacer funciones para actualizar el hud, del palo de hud_add_coins, hud_add_score, hud_set_time, hud_set_coins_1up, hud_set_coins_2up; vidas y level son fijos para todo el nivel y los pintaré antes de empezar.

Tengo que ver como montar la pantalla…

~~~

He metido toneladas de hud y todo está super bonito. Esto está casi (al menos la parte del motor del juego). Quedan detalles, mejores transiciones… Y luego la pirámide y tal.

Pero antes quiero ponerme a meter la música.

~~

Tengo que hacer una lista de los sonidos que voy a necesitar:

- Salto				Jump #3 		2
- Coger Monedas 		Laser 			5
- Ultima Moneda 		Door 			7
- Pincho 			Knife 			8
- Colisión enemigo 		Kill 			4
- Tic tic  			Wrong 			6
- Coger camiseta 		Item #2 		3
- Start 			Start #2 		1
- Select  			Select #2 		0

Tengo también 4 canales de efectos de sonido, y debo usarlos de forma sabia.

Lo suyo es dejar un canal para [PERSONAJE_1] y otro para [PERSONAJE_2], otro canal para los enemigos, y otro para los efectos de monedas / objetos. En el de enemigos meteré “última moneda” para que no se pise con otras cosas, a ver.

0 -> UWOL
1 -> MEEMAID
2 -> ENEMS
3 -> LEVEL

~~

Antes de irme a fregal… Voy a pensar en [MALO_ESPECIAL]. [MALO_ESPECIAL] irá en el slot 4 para enemigos. Estoy cruzando los dedos para que eso no me ralentice el tema. Si se ralentiza, no tengo más que sustituir uno de los enemigos como en el original. Pero no me gustaría tener que acudir a esa solución.

Lo primero es calcular el tiempo. Voy a mirar la fórmula que usa Shiru en el de Megadrive, que también va a 50/60fps, y uso algo parecido. Porque, sinceramente… me da miedo mirar mi código de [PERSONAJE_1] de Spectrum de hace siete años.

Tengo que controlar el tiempo usando ticks. Tengo el frame counter pero para contar de 50 en 50 no me sirve, así que dedicaré un unsigned char especial para contar los frames e ir decrementando el tiempo.

En los últimos 5 segundos debe sonar el “TIC TOC”.

Cuando llegue a cero, hago un flash molón de la pantalla (el sencillo, el que tira frames) y aparece [MALO_ESPECIAL]. La música cambia al time attack y dejo que todo siga su curso.

Para [MALO_ESPECIAL] usaré el de MK1 desactivando las colisiones con el escenario. También puedo simplificar la cosa teniendo en cuenta que siempre es el enemigo número 4. Quitar las variables de índices de ahí me simplificará muchísimo las cosas y ahorrará código y ciclos.

Voy, al menos, a adaptar el código antes de irme y cerrar por hoy.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s