Labyrinth of the Minotaur A simple roguelike/RPG using a nokia 5110 screen

Dependencies:   N5110 PowerControl mbed

WorldBuilder/WorldBuilder.cpp

Committer:
ThomasBGill
Date:
2015-05-04
Revision:
20:e54792b89571
Child:
21:aa4feee6aa39

File content as of revision 20:e54792b89571:

#include "WorldBuilder.h"

int map[84][48];

//Enterance coordinates
int enx;
int eny;

//Exit coordinates
int exx;
int exy;

int sx;
int sy;
int dir;

int level;

void Walls()
{
    //Fill map with walls
    for (int i = 0; i<84; i++) {
        for (int j = 0; j<48; j++) {

            map[i][j] = WALL;
        }
    }
}

void FirstRoom()
{
    //Create initial room
    int si = rand() % 25 + 1;
    int sj = rand() % 15 + 1;

    int sw = rand() % 5 + 5;
    int sh = rand() % 5 + 5;

    for (int i = si, w = si + sw; i <w; i++) {
        for (int j = sj, h = sj + sh; j <h; j++) {
            map[i][j] = FLOOR;
        }
    }
    //Create enterance in room
    enx = rand() % sw + si;
    eny = rand() % sh + sj;
    map[enx][eny] = ENTER;
}

void ExitRoom()
{
    //Create exit room
    int si = rand() % 50 + 30;
    int sj = rand() % 25 + 20;

    int sw = rand() % 5 + 5;
    int sh = rand() % 5 + 5;

    for (int i = si, w = si + sw; i <w; i++) {
        for (int j = sj, h = sj + sh; j <h; j++) {
            map[i][j] = FLOOR;
        }
    }
    //Create exit in room
    exx = rand() % sw + si;
    exy = rand() % sh + sj;
    map[exx][exy] = EXIT;

}

void DungeonRoomBuilder()
{
    sx = rand() % 84;
    sy = rand() % 48;

    //Get length
    int sw = rand() % 5 + 5;
    int sh = rand() % 5 + 5;

    for (int i = sx; i < sx + sw; i++) {
        for (int j = sy; j < sy + sh; j++) {
            if (i < 83 && j < 47) {
                if (map[i][j] == WALL) {
                    map[i][j] = FLOOR;
                }
            }
        }
    }

    if (rand() % 3 == 0) {
        int i = rand() % sw + sx;
        int j = rand() % sh + sy;
        map[i][j] = CHEST;
    }
}

int Neighbours(int i, int j)
{
    //Check neighbours
    int n = 0;

    if (map[i + 1][j] == FLOOR) {
        n++;
    }
    if (map[i - 1][j] == FLOOR) {
        n++;
    }
    if (map[i][j + 1] == FLOOR) {
        n++;
    }
    if (map[i][j - 1] == FLOOR) {
        n++;
    }

    return n;
}

void DeadEnds(int d)
{
    for (int del = d; del > 0; del--) {
        for (int i = 0; i < 84; i++) {
            for (int j = 0; j < 48; j++) {

                if (Neighbours(i, j) < 2) {
                    map[i][j] = WALL;
                }
            }
        }
    }
}

void Border()
{

    for (int i = 0; i < 84; i++) {
        for (int j = 0; j < 48; j++) {

            if (i == 0 || i == 83 || j == 0 || j == 47) {

                map[i][j] = WALL;

            }
        }
    }
}

void RandFloor(int r)
{

    for (int space = rand() % 50 + r; space > 0; space--) {

        int i = rand() % 84;
        int j = rand() % 48;

        if (rand() % 2 == 0 && map[i][j] == WALL) {
            map[i][j] = FLOOR;
        }
    }

}

void MazeKill()
{

    int move[4] = { UP, DOWN, LEFT, RIGHT };

    bool moved = true;

    while (moved == true) {

        moved = false;

        for (int s = 0; s < 3; s++) { //Shuffle array

            int r = rand() % 4;

            int temp = move[s];

            move[s] = move[r];

            move[r] = temp;
        }



        for (int i = 0; i < 3; i++) {
            if (move[i] == UP) {
                if (map[sx][sy - 1] == WALL && Neighbours(sx, sy - 1) == 1 && map[sx][sy - 2] == WALL && Neighbours(sx, sy - 2) == 0 && sy > 3) {
                    map[sx][sy - 1] = FLOOR;
                    map[sx][sy - 2] = FLOOR;
                    sy = sy - 2;
                    moved = true;
                    break;
                }
            }
            else if (move[i] == DOWN) {
                if (map[sx][sy + 1] == WALL && Neighbours(sx, sy + 1) == 1 && map[sx][sy + 2] == WALL && Neighbours(sx, sy + 2) == 0 && sy < 45) {
                    map[sx][sy + 1] = FLOOR;
                    map[sx][sy + 2] = FLOOR;
                    sy = sy + 2;
                    moved = true;
                    break;
                }
            }
            else if (move[i] == LEFT) {
                if (map[sx - 1][sy] == WALL && Neighbours(sx - 1, sy) == 1 && map[sx - 2][sy] == WALL && Neighbours(sx - 2, sy) == 0 && sx > 3) {
                    map[sx - 1][sy] = FLOOR;
                    map[sx - 2][sy] = FLOOR;
                    sx = sx - 2;
                    moved = true;
                    break;
                }
            }
            else if (move[i] == RIGHT) {
                if (map[sx + 1][sy] == WALL && Neighbours(sx + 1, sy) == 1 && map[sx + 2][sy] == WALL && Neighbours(sx + 2, sy) == 0 && sx < 81) {
                    map[sx + 1][sy] = FLOOR;
                    map[sx + 2][sy] = FLOOR;
                    sx = sx + 2;
                    moved = true;
                    break;
                }
            }
        }
    }

}

void Maze()
{
    sx = 1;
    sy = 1;

    //Choose random direction
    //Check if 2 cells in direction have no neighbours (excluding current position)
    //If true then build and set new current position
    //If false chose next direction

    //If cannot move in any direction scan through each cell until there is one which can be built on
    //If scan completes END

    int end = false;

    while (end == false) {

        end = true;

        map[sx][sy] = FLOOR;

        MazeKill();

        //DrawMap();

        for (int i = 1; i < 83; i++) {
            for (int j = 1; j < 47; j++) {

                if (map[i][j] == WALL && Neighbours(i, j) == 1) {
                    sx = i;
                    sy = j;

                    end = false;
                }

            }
        }

    }
}

void DungeonBuilder()
{

    Maze();

    FirstRoom();
    ExitRoom();

    int rn = rand() % 10 + 6;

    for (int i = rn; i>0; i--) {
        DungeonRoomBuilder();
    }



    RandFloor(51);

    Border();

    DeadEnds(20);

}

void LabyrinthBuilder()
{

    Maze();

    FirstRoom();
    ExitRoom();



    RandFloor(151);

    DeadEnds(1);

    Border();

}