Isshokuta; 20160523

Con el motor de movimiento básicamente listo (a la espera de ser optimizado en espacio y convertido en un monstruo ilegible), toca empezar a hacerse pajas mentales con respecto a los enemigos y su IA. La dificultad no es tanto la IA en sí, que será mediante patrones con una mínima dependencia del contexto (excenario y posición/orientación del jugador), sino intentar tener el máximo número de comportamientos empleando el código más reducido y simple posible.

Por ello, he pensado que quizá sería buena idea que todos los enemigos fuesen gestionados por la misma función, pero que cada uno llevase cierta “programación” de comportamientos que definiese su patrón y su dependencia del contexto. Sería algo así como un microscript. Esto me puede dar gran variedad de enemigos si me funciona bien.

La forma de lanzar los enemigos deberá emplear la “tira de enemigos” que usé en Jill de MSDOS. Cuando entre un nuevo tile, se creará ese enemigo si “cabe” (¡creo que no podré permitirme gestionar más de 3-4 a la vez!). Habrá que definir muy bien las condiciones por las que un enemigo “desaparece”. Los enemigos deben estar diseñados para durar poco, por lo que deberían desaparecer si salen de la pantalla, si son eliminados de una hostia, o si chocan con el jugador.

Veamos cosas de enemigos:

  • Salir arriba o abajo. Esto va pre-calculado en la tira.
  • Gráfico que lleva. En la tira [*]
  • Salir desde la izquierda o desde la derecha. Tira.
  • Comportamiento:
    • Avanzar hasta el otro lado de la pantalla.
    • Avanzar hasta X = pX + N. Mejor: hasta distancia D con pX
    • Avanzar X píxels.
    • Darse la vuelta.
    • Disparar un proyectil hacia el jugador por arriba.
    • Disparar un proyectil hacia el jugador por abajo.
    • Saltar.
    • Soltar una hostia hacia el jugador.
    • Cambiar de nivel, si es posible.
  • Comprobaciones:
    • El jugador está en mi nivel.
    • El jugador no está en mi nivel.
    • Jugador frente a mí.
    • Jugador a mi espalda.
    • Jugador cerca para hostial.
    • Jugador agachado.
    • Jugador saltando.
    • Jugador golpeando.

[*] El gráfico puede ser una combinación de parte de arriba, parte de abajo, y paleta.

Lo suyo sería, como he dicho, definir comportamientos con una tira de bytes que representen condiciones o acciones. Cada enemigo activo tendría un puntero a su tira de comportamiento y lo iría consumiendo a medida que lo vaya necesitando. En cada frame o ciclo de ejecución sólo consume una casilla, aunque no haga “nada” (así parecerá que se paran a pensar). Debería ser posible hacer loops haciendo saltos absolutos especificando un offset. Las tiras no deberían ser muy largas. ¡Debería poder codificar cada comando o comprobación en un BYTE! excepto saltos, claro.

Esto va a ser complicado, pero si sale va a molar.

OPCODE		QUE
00 		FIN
10 		Avanzar hasta el lado contrario de la pantalla.
1X 		Con X = 1 .. 7: Avanzar X*32 pixels.
2X		Con X = 1 .. 7: Avanzar hasta |pX-eX| <= X*32 (acercándose) 3X 		Con X = 1 .. 7: Avanzar hasta |pX-eX| >= X*32 (alejándose)
40 		Darse la vuelta (inmediato)
41 		Saltar (state -> jump)
42 		Cambiar de nivel (state -> go_up o go_down)
50 		Disparar proyectil por arriba (inmediato)
51 		Disparar proyectil por abajo (inmediato)
52 		Hostia (puede que saltando)

CE 		Goto {next byte}

CF 		No hacer nada

DX 		Jugador a menos de X*32 (acercándose)
		[(efacing && px < ex) || (!efacing && px > ex)]
EX 		Jugador a más de X*32 (alejándose) 
		[(efacing && px > ex) || (!efacing && px < ex)] F0 		Jugador en mi nivel F1 		Jugador no en mi nivel F2 		Jugador frente a mí F3 		Jugador a mi espalda F4 		Jugador cerca para hostial F5 		Jugador agachado F6 		Jugador saltando F7 		Jugador golpeando FF 		Idle -> ha terminado de hacer la anterior cosa.

Los “Ifs” saltarán a PC+1 si son ciertos (siguiente orden, nada que hacer), o PC + 3 si son falsos. Así, justo después nos cabe un GOTO.

Obviamente, puede que necesite un ensamblador sencillo para definir estos comportamientos, pero antes tengo que hacer trabajo gráfico y ver cómo meter el mayor número de enemigos en los patrones que quedan.

~~~

Como yo soy diseñador y grafista antes que dale Fran, me gusta tener antes cosas tangibles con las que trabajar. En este caso, sprites. Si opto por la ruta de tener pies y cuerpos por separado, ganaré mucho. Lo primero que tengo que hacer es un set de cuerpos que pueda superponer. El problema es que no se me dividen bien, voy a tener que hacer pruebas gráficas (ahora mismo, de los 5 cuadros que ocupan los sprites de alto, sólo 2.6 son las piernas. Tendría que extender esta parte del cuerpo o algo) – el problema principal es la superposición de sprites, que haría que la cuenta de sprites alineados bajase un montón. Uf. Todo son problemas.

Voy a tener que poner a todos los personajes con las manos como andore XD o inventarme otra cosa 😛 Ya lo veré sobre photoshop. Por lo pronto, y a falta de hacer un frame para cuando hostian a la personaja, estoy ocupando 111 patrones de los 256. Ah, y esto puede ser CNROM, así que puedo cambiar el set ¿por qué me preocupo tanto?

Hasta que no me pueda poner a tirar píxels, no sabré qué hacer. Como de costumbre.

~~~

Gññññ. Quiero dibujal.

~~~~

Va a ser que hoy chungou cubata. Pero 100% chungo. Posibilidades = 0.

Ejemplo de programación, para un jugador que sale por abajo en el nivel inferior:

offset	opcode 	cosa
00 	10 	- Avanzar hasta el lado contrario de la pantalla
01 	D2 	- Cuando se acerca hasta 64 píxels o menos, 
02 	CE 	- GOTO
03 	06 	       06
04 	CE 	- GOTO
05 	01 		01
06 	41 	- Saltar
07 	FF 	- Cuando IDLE (termina de saltar)
08 	CE 	- GOTO
09 	0C 	       0C
0A  	CE 	- GOTO
0B 	07 	       07
0C 	40 	- Darse la vuelta
0D 	10 	- Avanzar hasta el lado contrario de la pantalla
0E 	F4 	- Jugador cerca para hostia
0F 	CE 	- GOTO
10  	13 	       13
11 	CE 	- GOTO
12 	0E 	       0E
13 	52 	- Hostia
14 	40 	- Darse la vuelta
15 	10 	- Avanzar hsta el lado contrario de la pantalla
16 	00 	- Fin

Esto tiene agujeros por todos lados. Tengo que pensarlo mejor. ¿Las ordenes son atómicas, o no? ¿Cuándo se avanza en la tira? Tengo que darle muuuchas más vueltas. Por suerte, tengo mucho que dibujar y otros proyectos a los que antender mientras me voy inventando esto. Pero parece que podría funcionar muy bien, tiene muy buena pinta y me da muy buen rollo.

~~~

Urn, he pintado un set de piernas y algunos cuerpos. Seguro que me falta de todo. He reaprovechado gráficos de la protagonista principal. Quizá debería hacerlos deliberadamente diferentes para que no reaprovechen y vea si realmente caben por si en alguna fase quiero hacerlos distintos. Eso es cosa fácil, por otro lado.

Pero vamos, que se va acercando la hora de la verdad. Le daré buenas pensadas al tema durante un par de días, a ver qué sale. Si no resuelvo, empiezo Sir Ababol 2.

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