Saturday, February 12, 2011

Dungeon Crawler II

Hace bastante que no comento los avances en el juego y ahora tengo algo de tiempo (un recreo bah :P)

Bueno, en principio empecé el martes a la tarde cuando tuve el programador en mis manos -bwahahaha-, lo segui el jueves con más tiempo y recién un poco. Las cosas que se pueden hacer por ahora es observar el nivel moviéndose con las flechas. El mundo es de hasta 75x75 (por tener 15x15 de los registros que comentaba antes, a los cuales voy a llamar Chunk porque me recuerdan a lo que hace Minecraft)


Un Chunk, entonces, es un byte codificado como "NSEO ABCD", habiendo un bit en N/S/E/O si hay una salida en esa dirección y siendo ABCD la forma que tiene el conjunto de bloques. Hay 16 combinaciones de ABCD, pero sólo ocho de ellas dan forma a conjuntos distintos -no, no me iba a poner a pensar dieciseis diferentes-.

El truco está en que cuando AB != CD, se generan dos conjuntos de 5x5 bloques que luego mediante un AND lógico arman las diferentes combinaciones. Si AB == CD, entonces se genera un único conjunto según el valor de AB.

Finalmente, si por ejemplo no hay salida al "norte", eso se traduce en un bloque de 5x5 vacío con la parte superior bloqueada que tendrá efecto en el conjunto final mediante un OR. Todo esto muy teóricamente, en realidad no necesita tooodos los 5x5 bloques para sacar los datos que usa.


Lo interesante vino cuando tuve que juntar dos o tres chunks para armar el byte que dice dónde hay bloques en las posiciones {(x + i, y), i <- [0 .. 8)} del mundo. Luego de eso tuve problemas con el redireccionamiento indirecto del PIC porque creía que andaba de otra forma :P

Como resultado final, tengo un nivel de tamaño variable, de 1 hasta 15 chunks encolumnados por otros 1 a 15 chunks en fila, dándome los 15x15 chunks, o 75x75 bloques. Además, el mundo es circular y no tiene fin, ya que irse por el este termina llevando al oeste.

Pero basta por un rato de charla técnica y veamos un video:



El video creo que muestra un par de bugs (a ver si los encuentran!) que venían del mal uso del redireccionamiento indirecto. Estuve un rato en la mañana tratando de arreglarlo y es genial cuando sabés que algo está andando 'raro', entendés por qué salen los errores y tenés una sospecha de cuál es el problema, todo para que una búsqueda en google te dé la razón :)


Lo que hice hace un rato es agregar los datos del personaje. A modo de prueba le puse 17/50 de MP (magic points), 40/50 de HP y lvl 39. Dibujar las barras de HP y MP fue un desafío que creo haber solucionado de manera inteligente.

Por ejemplo, para el HP tengo dos barras, cada barra ocupando dos posiciones, digamosle, en el lcd, con cada subbarra teniendo ocho pixels de alto. La idea entonces fue usar el recurso mágico de la búsqueda binaria. Con cuatro subbarras (una potencia de dos), con ocho pixels cada una (otra potencia de dos), tenía entonces 32 pixels para ver de dibujar. La idea consiste en tomar la mitad del máximo de HP (25), ver si es mayor o menor que el actual (40), y a partir de ahí decidir si había que pintar más o menos de 16 pixels, para luego repetir el proceso.

En este caso, sería así:
MHP: 50
HP: 40
pixels = 0

MHP / 2 = 25
40 >= 25
pixels = 16

(MHP / 2) + MHP / 4 = 25 + 12 = 37
40 >= 37
pixels = 16 + 8 = 24

(MHP / 2) + MHP / 4 + MHP / 8 = 25 + 12 + 6 = 43
40 <>pixels = 16 + 8 = 24

(MHP / 2) + MHP / 4 + MHP / 16 = 25 + 12 + 3 = 40
40 >= 40
pixels = 16 + 8 + 2 = 26


Con 26 pixels para dibujar, sabía que tenía las primeras tres subbarras completamente llenas y la 4ta con 26 - 24 = 2 pixels

Lo mismo pasa con la de MP. El problema está en la barra de experiencia (XP), que no usa un byte sino dos (para poder tener 31256/65536 xp en vez de los limitados 78/255). La idea en el fondo sería la misma, aunque un poco más complicada porque tendría que manejar dos registros, pero creo que mañana estaría andando.


Y para terminar, dejo video de cómo quedó todo eso:



No comments:

Post a Comment