Monday, February 14, 2011

Dungeon Crawler III

Después de experimentar con el dibujo de las barras y la info del personaje, me puse a hacer una visión extendida del nivel -estilo mapa- que no se si estará en la versión final (aunque está bueno poder ver cómo quedaron la mayoría de los chunks unidos). Ah, también hice magia y ahora hay hasta 16x16 chunks, dando un nivel de 80x80 bloques máximo.

Lo divertido del domingo y hoy a la mañana fue armar la generación de niveles. Primero se definían al azar las dimensiones del nivel. Como recordarán, cada chunk tenía 8 bits, NSEO ABCD, habiendo un 1 en N/S/E/O si existía una salida en esa dirección. La idea, entonces, era generar primero por X y luego por Y. Si no era el primer chunk en X, entonces asignaba su bit de salida Oeste al mismo que tenía el de salida Este de su vecino (X-1). Si no era el primer chunk en Y, hacía lo mismo con el de arriba. Si era el último en X, chequeaba que su salida Este fuera igual a la Oeste del primero en X, idem Y.


Pseudocódigo para los que lo pueden entender (nota: los tabs son nuestros amigos)

for (y = 0; y <= chunkSizeY; y++) {
    for (x = 0; x <= chunkSizeX; x++) {
        chunk[y][x] = random(); //Genera byte al azar
        if (x > 0) chunk[y][x][5] = chunk[y][x - 1][4]
        if (y > 0) chunk[y][x][7] = chunk[y - 1][x][6]
        if (x == chunkSizeX - 1) chunk[y][x][4] = chunk[y][0][5]
        if (y == chunkSizeY - 1) chunk[y][x][6] = chunk[0][x][7]

        //Extras
    }
}

Luego de los chequeos de salidas de arriba, hay que evitar que existan islas -pedazos de nivel inconectables-. La idea que se me ocurrió fue forzar a que haya una salida en 1 que no sea obligatoria, o sea, si por ejemplo estamos con x = 1, y = 0, la salida Oeste sería obligatoriamente la misma que la del Este del vecino, entonces por más que esté en 1 no cuenta y habría que ver las otras tres que son 'libres', digamos.

En el caso en que todas las salidas sean obligatorias, fuerzo a que exista una salida al norte, cosa de que no me quede ese chunk separado del resto. Generado el nivel, busco una posición al azar para el pj y otra para la salida.

¿Ventajas de no tener islas? Todo el nivel es explorable, no me tengo que preocupar porque no se pueda llegar a la salida, o encontrar un item o bicho, o algo. Bajar la escalera (ese es el dibujo) indica que hay que regenerar el nivel, las posiciones, los items, bichos, etc.


Lo siguiente sería agregar los mobs. En principio tengo pensado momias y murciélagos, después veré qué cosas se pueden dibujar con 8x8 pixels. Cada bicho definiría su poder de daño según su raza y la profundidad del dungeon, al igual que su HP. Estoy pensando en que aparecerían cuando el pj va caminando por ahí, al igual que con los items. Y además creo que estaría bueno dejar que se muevan en tiempo real -o sea, no un turno yo, un turno ellos- cosa de hacerlo más emocionante.

Bajar el hp de un bicho a cero quizás lo haría droppear algún item y daría una cierta experiencia que depende de la raza del bicho y la profundidad del dungeon.


En fin, tengo muchas cosas para pensar sobre cómo continuar y hacerlo divertido y justo en su dificultad. Creo que ya está al 50%, dado que así es un juego de exploración -aunque no el más entretenido quizás-.

Se aceptan ideas sobre mobs, items, skills, etc!!

1 comment:

  1. ¡¡Kapo!!
    no tengo idea de los mobs, ni de qué items decís, ni los skills, pero todos suenan muy bien así! =)
    Salu2!! y a seguir programando!!
    ///

    ReplyDelete