Thomas Gill / Mbed 2 deprecated LabyrinthOfTheMinotaur

Dependencies:   N5110 PowerControl mbed

main.cpp

Committer:
ThomasBGill
Date:
2015-05-02
Revision:
16:a26d7519830e
Parent:
15:05a227f970c2
Child:
17:8790dd599b25

File content as of revision 16:a26d7519830e:

#include "mbed.h"
#include "N5110.h"
#include "PowerControl/PowerControl.h"
#include "PowerControl/EthernetPowerControl.h"

//         vcc sce rst dc  mosi clk  led
N5110 lcd (p5, p6, p7, p8, p11, p13, p21);
InterruptIn Act (p22);
InterruptIn Start (p23);
InterruptIn Up (p24);
InterruptIn Down (p25);
InterruptIn Left (p26);
InterruptIn Right (p27);
AnalogIn Noise (p19);

#define USR_POWERDOWN (0x104)

#define WALL 0
#define FLOOR 1
#define ENTER 2
#define EXIT 3
#define FLOOR_SEEN 4
#define CHEST 5
#define CHEST_OPENED 6

#define RIGHT 0
#define LEFT 1
#define UP 2
#define DOWN 3

#define SOUTH 0
#define EAST 1

struct TILES {
    char    Symbol; // Symbol for this tile
    bool   Passable; // Can tile be walked on
};

TILES  TileList[] = {
    { '#', false },  // 0- WALL
    { '.', true},  // 1- FLOOR
    { '+', true }, // 2- ENTER
    { 'x', true },  // 3- EXIT
    { '.', true},  // 4- FLOOR_SEEN
    { '=', true},  // 5- CHEST
    { '/', true},  // 6- CHEST_OPENED
};

struct ITEMS {
    char  ItemName[15]; //Item name
    int ItemValue; //Damage/ armour value
};

ITEMS  ItemList[] = {
    //Weapons
    { "Dagger", 4},  //0
    { "Axe", 5},  //1
    { "Mace", 6},  //2
    { "Sword", 7},  //3
    { "Warhammer", 10}, //4
    //Armour
    { "Cloth armour", 0},  //5
    { "Leather armour", 2},  //6
    { "Studded armour", 4},  //7
    { "Chainmail vest", 6}, //8
    { "Plate armour", 8}, //9
};

struct ENEMIES {
    char  EName[14]; //Enemy name
    int   EHealth; //Enemy health
    int   EDamage; //Enemy damage
    int   EArmour; //Enemy armour
    int EDodge; //Enemy dodge chance
    int EHit; //Enemy hit chance
    int ESpd; //Enemy speed (use for running away during fights)
};

ENEMIES  EnemyList[] = {
    {"Huge Rat", 5, 3, 0, 25, 70, 40},  //0- Huge Rat
    {"Goblin", 6, 3, 2, 25, 60, 30}, //1- Goblin
    {"Skeleton", 8, 5, 3, 10, 50, 10}, //2- Skeleton
    {"Giant Spider", 6, 5, 0, 40, 60, 50}, //3- Giant Spider
};

//Variables
int ActFlag = 0;
int StartFlag = 0;
int DirFlag = 0;

int map[84][48];

//Enterance coordinates
int enx;
int eny;

//Exit coordinates
int exx;
int exy;

int sx;
int sy;
int dir;

int level;

//Space type player is on
int pSpace;

//Player coordinates
int px;
int py;

//Player Health
int ph = 15;

//Player weapon
int pw = 0; //0 to 4

//Player armour
int pa = 5; //5 to 9

//Power Saving
int semihost_powerdown()
{
    uint32_t arg;
    return __semihost(USR_POWERDOWN, &arg);
}

//ISR
void ActPressed()
{
    ActFlag = 1;
}
void StartPressed()
{
    StartFlag = 1;
}
void DirPressed()
{
    DirFlag = 1;
}

//Voids
void MainMenu();
void GameLoop();

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 Floors()
{
    //Fill map with floors
    for(int i=0; i<84; i++) {
        for (int j=0; j<48; j++) {
            map[i][j] = FLOOR;
        }
    }
}

void FlashPlayerLocation()
{
    lcd.setPixel(px,py);
    lcd.refresh();
    wait(0.5);
    lcd.clearPixel(px,py);
    lcd.refresh();
    wait(0.5);
}


void DrawMap()
{
    //Draw map on screen
    for(int i=0; i<84; i++) {
        for (int j=0; j<48; j++) {
            if(map[i][j] == FLOOR_SEEN || map[i][j] == CHEST_OPENED) {
                lcd.clearPixel(i, j);
            } else {
                lcd.setPixel(i, j);
            }
        }
    }
    lcd.refresh();
}

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;

    int b = 0;

    //Check each space. +1 to variable if wall. If total = w*h then build room
    for(int i = sx; i < sx + sw; i++) {
        for(int j = sy; j < sy + sh; j++) {
            if(map[i][j] == WALL) {
                b++;
            }
        }
    }
    if(b == sw*sh) {
        for(int i = sx; i < sx + sw; i++) {
            for(int j = sy; j < sy + sh; j++) {
                if(i < 84 && j < 48) {
                    map[i][j] = FLOOR;
                }
            }
        }
    }
    if(rand()%4 == 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 Maze()
{
    for(int i = 0; i < 84; i+=2) {
        for(int j = 0; j < 48; j+=2) {

            if(map[i][j] == WALL) {
                map[i][j] = FLOOR;
            }

            dir = rand()%2; //South or east


            if(dir == SOUTH && j < 47 && map[i][j+1] == WALL) {
                map[i][j+1] = FLOOR;
            }
            if(dir == EAST && i < 84 && map[i+1][j] == WALL) {
                map[i+1][j] = FLOOR;
            }
        }
    }
}

void DungeonBuilder()
{

    FirstRoom();
    ExitRoom();

    int rn = rand()%20 + 10;

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

    Maze();

    RandFloor(51);

    Border();

    DeadEnds(20);

}

void LabyrinthBuilder()
{

    FirstRoom();
    ExitRoom();

    Maze();

    RandFloor(551);

    Border();

}

void World()
{
    Walls();
    if(level == 5) {
        LabyrinthBuilder();
    } else {
        DungeonBuilder();
    }

    px = enx;
    py = eny;

    wait(1.0);
}

void PlayerCamera()
{
    lcd.clear();

    int tile;

    for(int i = 0; i < 14; i++) {
        for(int j = 0; j < 6; j++) {

            if(i == 6 && j == 2) {
                lcd.printString("@", (6*i)+1, j);
            } else {
                int diffx = i - 6;
                int diffy = j - 2;

                if(px+diffx < 84 && px+diffx > 0 && py+diffy < 48 && py+diffy > 0) {
                    tile = map[px+diffx][py+diffy];
                } else {
                    tile = WALL;
                }
                lcd.printChar(TileList[tile].Symbol, (6*i)+1, j);

                if(map[px+diffx][py+diffy] == FLOOR) {
                    map[px+diffx][py+diffy] = FLOOR_SEEN;
                }

            }
        }
    }
    lcd.refresh();
}

void PlayerMove()
{
    if(Up) {
        int tile = map[px][py-1];
        if(TileList[tile].Passable) {
            py--;
        }
    }
    if(Down) {
        int tile = map[px][py+1];
        if(TileList[tile].Passable) {
            py++;
        }
    }
    if(Right) {
        int tile = map[px+1][py];
        if(TileList[tile].Passable) {
            px++;
        }
    }
    if(Left) {
        int tile = map[px-1][py];
        if(TileList[tile].Passable) {
            px--;
        }
    }
}

void GameOver()
{
    lcd.inverseMode();
    lcd.clear();
    lcd.printString("GAME OVER", 12, 2);
    lcd.refresh();
    wait(1.0);
    Sleep();
    lcd.normalMode();
    MainMenu();
}

void MonsterAttack(int m)
{
    if(rand()%100 + 1 < EnemyList[m].EHit) { //If monster hits and isn't dead

        int damage = EnemyList[m].EDamage - ItemList[pa].ItemValue + rand()%3 - rand()%3; //Calculate damage
        if (damage < 0) {
            damage = 0;
        }
        ph = ph - damage; //Apply damage and calculate the monster's health

        char buffer[14];
        int write = sprintf(buffer,"%d damage",damage); // print formatted data to buffer

        lcd.clear();
        lcd.printString(EnemyList[m].EName, 0 ,1);
        lcd.printString("hits you for", 0 , 2);
        lcd.printString(buffer, 0 , 3);
        lcd.refresh();
        wait(1.0);
        Sleep();

    } else { //You dodge
        lcd.clear();
        lcd.printString("You dodge the", 0 ,1);
        lcd.printString("monster's", 0 , 2);
        lcd.printString("attack", 0 , 3);
        lcd.refresh();
        wait(1.0);
        Sleep();
    }
    if(ph <= 0) { //Check if player is dead
        GameOver();
    }

}

void Fight()
{
    int m = rand()%level;

    int mh = EnemyList[m].EHealth;

    lcd.clear();
    lcd.printString("FIGHT!", 24, 2);

    for(int i = 0; i<5; i++) {
        lcd.inverseMode();
        lcd.refresh();
        wait(0.2);
        lcd.normalMode();
        lcd.refresh();
        wait(0.2);
    }

    bool menu = 1;

    while(1) {
        ActFlag = 0;
        StartFlag = 0;
        DirFlag = 0;

        lcd.clear();

        lcd.printString(EnemyList[m].EName, 0, 0);
        char buffer1[14];
        int write = sprintf(buffer1,"%d/%d",mh, EnemyList[m].EHealth); // print formatted data to buffer
        lcd.printString(buffer1, 54, 0);

        lcd.printString("You", 0, 2);
        char buffer2[14];
        write = sprintf(buffer2,"%d/15",ph); // print formatted data to buffer
        lcd.printString(buffer2, 54, 2);

        if(menu) {
            lcd.printString("Fight <", 0, 4);
            lcd.printString("Run", 0, 5);
        } else {
            lcd.printString("Fight", 0, 4);
            lcd.printString("Run <", 0, 5);
        }
        lcd.refresh();
        Sleep();

        if(DirFlag) {
            DirFlag = 0;
            menu = !menu;
        }
        if(ActFlag) {
            ActFlag = 0;
            if(menu) { //Fight
                //Hit monster
                if(rand()%100 + 1 > EnemyList[m].EDodge) { //If monster doesn't dodge

                    int damage = ItemList[pw].ItemValue - EnemyList[m].EArmour + rand()%3 - rand()%3; //Calculate damage
                    if (damage < 0) {
                        damage = 0;
                    }
                    mh = mh - damage; //Apply damage and calculate the monster's health

                    char buffer3[14];
                    write = sprintf(buffer3,"for %d damage",damage); // print formatted data to buffer

                    lcd.clear();
                    lcd.printString("You hit the", 0 , 1);
                    lcd.printString(EnemyList[m].EName, 0 ,2);
                    lcd.printString(buffer3, 0, 3);
                    lcd.refresh();
                    wait(1.0);
                    Sleep();

                } else { //Monster dodges
                    lcd.clear();
                    lcd.printString(EnemyList[m].EName, 0 ,1);
                    lcd.printString("dodges your", 0 , 2);
                    lcd.printString("attack", 0 , 3);
                    lcd.refresh();
                    wait(1.0);
                    Sleep();
                }

                if(mh <= 0) { //Check if monster is dead
                    lcd.clear();
                    lcd.printString("You win!", 18, 2);
                    lcd.refresh();
                    wait(1.0);
                    Sleep();
                    break;
                }

                MonsterAttack(m);


            } else { //Run away

                int b = rand()%5;

                if(b == 0) { //Monster blocks the path

                    lcd.clear();
                    lcd.printString("You try to run", 0, 0);
                    lcd.printString("away but the", 0, 1);
                    lcd.printString("monster blocks", 0, 2);
                    lcd.printString("the path", 0, 3);
                    lcd.refresh();
                    wait(1.0);
                    Sleep();

                    MonsterAttack(m);

                } else {

                    int s = rand()%100 + 1;

                    if(s > EnemyList[m].ESpd) { //If you outspeed monster

                        lcd.clear();
                        lcd.printString("You run away", 6, 2);
                        lcd.refresh();
                        Sleep();
                        break;

                    } else {

                        lcd.clear();
                        lcd.printString("You try to run", 0, 0);
                        lcd.printString("away but the", 0, 1);
                        lcd.printString("monster", 0, 2);
                        lcd.printString("catches up to", 0, 3);
                        lcd.printString("you", 0, 4);
                        lcd.refresh();
                        wait(1.0);
                        Sleep();

                        MonsterAttack(m);

                    }


                }
            }
        }
    }
}

void Map()
{
    lcd.clear();
    DrawMap();
    while(!StartFlag) {
        FlashPlayerLocation();
    }
    StartFlag = 0;
    ActFlag = 0;
    DirFlag = 0;
}


void Inventory()
{
    lcd.clear();
    lcd.printString("Armour:", 0, 0);
    lcd.printString(ItemList[pa].ItemName, 0, 1);
    char buffer1[14];
    int write = sprintf(buffer1,"+%d Armour", ItemList[pa].ItemValue); // print formatted data to buffer
    lcd.printString(buffer1, 0, 2);

    lcd.printString("Weapon:", 0, 3);
    lcd.printString(ItemList[pw].ItemName, 0, 4);
    char buffer2[14];
    write = sprintf(buffer2,"+%d Damage", ItemList[pw].ItemValue); // print formatted data to buffer
    lcd.printString(buffer2, 0, 5);
    lcd.refresh();

    while(1) {
        Sleep();

        if(ActFlag) {
            ActFlag = 0;
        }
        if(DirFlag) {
            DirFlag = 0;
            break;
        }
        if(StartFlag) {
            StartFlag = 0;
            break;
        }
    }
}

void MapLegend()
{
    lcd.clear();
    lcd.printString("@ Player", 0 ,0);
    lcd.printString("# Wall", 0, 1);
    lcd.printString(". Floor", 0, 2);
    lcd.printString("= Chest", 0, 3);
    lcd.printString("/ Open Chest", 0, 4);


    while(1) {
        Sleep();

        if(ActFlag) {
            ActFlag = 0;
        }
        if(DirFlag) {
            DirFlag = 0;
            break;
        }
        if(StartFlag) {
            StartFlag = 0;
            break;
        }
    }
}

void StartMenu()
{
    int menu = 0;

    char buffer[14];
    int write = sprintf(buffer,"Health  %d/15",ph); // print formatted data to buffer


    while(1) {
        if(menu == 0) {
            lcd.clear();
            lcd.printString(buffer, 0, 0);
            lcd.printString("Map <", 0, 2);
            lcd.printString("Map Legend", 0, 3);
            lcd.printString("Inventory", 0, 4);
            lcd.printString("Continue", 0, 5);
            lcd.refresh();
            Sleep();
        } else if (menu == 1) {
            lcd.clear();
            lcd.printString(buffer, 0, 0);
            lcd.printString("Map", 0, 2);
            lcd.printString("Map Legend <", 0, 3);
            lcd.printString("Inventory", 0, 4);
            lcd.printString("Continue", 0, 5);
            lcd.refresh();
            Sleep();
        } else if (menu == 2) {
            lcd.clear();
            lcd.printString(buffer, 0, 0);
            lcd.printString("Map", 0, 2);
            lcd.printString("Map Legend", 0, 3);
            lcd.printString("Inventory <", 0, 4);
            lcd.printString("Continue", 0, 5);
            lcd.refresh();
            Sleep();
        } else if (menu == 3) {
            lcd.clear();
            lcd.printString(buffer, 0, 0);
            lcd.printString("Map", 0, 2);
            lcd.printString("Map Legend", 0, 3);
            lcd.printString("Inventory", 0, 4);
            lcd.printString("Continue <", 0, 5);
            lcd.refresh();
            Sleep();
        }

        if(DirFlag) {
            DirFlag = 0;
            if((Down || Right) && menu < 3) {
                menu++;
            } else if((Up ||Left) && menu > 0)
                menu--;
        }
        if(ActFlag) {
            ActFlag = 0;
            if(menu == 0) {
                Map();
            } else if(menu == 1) {
                MapLegend();
            } else if(menu == 2) {
                Inventory();
            } else {
                break;
            }
        }
        if(StartFlag) {
            StartFlag = 0;
        }
    }
}


void Intro()
{
    lcd.clear();
    lcd.printString("TBG RPG", 20, 2);
    lcd.refresh();
    wait(1.0);
}

void LevelScreen()
{
    char buffer[14];

    int write = sprintf(buffer,"Level %d",level); // print formatted data to buffer

    lcd.clear();
    lcd.printString(buffer, 20, 2);
    lcd.refresh();
    wait(1.0);

}

void getItem()
{

    int r = rand()%10;

    DirFlag = 0;

    lcd.clear();
    lcd.printString("Do you want to", 0, 1);
    lcd.printString("take the", 0, 2);
    lcd.printString(ItemList[r].ItemName, 0, 3);
    lcd.printString("-Yes (Action)", 0, 4);
    lcd.printString("-No (Other)", 0, 5);
    lcd.refresh();
    wait(1.0);
    Sleep();


    if(ActFlag) {

        ActFlag = 0;

        if (r > 5) {
            pa = r;
        } else {
            pw = r;
        }

        lcd.clear();
        lcd.printString("You take the", 0, 1);
        lcd.printString(ItemList[r].ItemName, 0, 2);
        lcd.refresh();
        wait(1.0);
        Sleep();

    } else {

        StartFlag = 0;
        DirFlag = 0;

        lcd.clear();
        lcd.printString("You leave the", 0, 1);
        lcd.printString(ItemList[r].ItemName, 0, 2);
        lcd.refresh();
        wait(1.0);
        Sleep();
    }
}

void BoobyTrap()
{

    int damage = rand()%5;

    if(damage != 0) {

        ph = ph - damage;

        char buffer[15];
        int write = sprintf(buffer, "You recive %d", damage);

        lcd.clear();
        lcd.printString("The chest is", 0, 0);
        lcd.printString("booby trapped!", 0, 1);
        lcd.printString(buffer, 0, 3);
        lcd.printString("damage", 0, 4);
        lcd.refresh();
        wait(1.0);
        Sleep();

        //Check if player is dead
        if(ph < 0) {
            GameOver();
        }
    } else {

        lcd.clear();
        lcd.printString("The chest is", 0, 0);
        lcd.printString("booby trapped", 0, 1);
        lcd.printString("but the trap", 0, 2);
        lcd.printString("fails", 0, 3);
        lcd.refresh();
        wait(1.0);
        Sleep();

    }
}

void RevealMap()
{

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

            if(map[i][j] == FLOOR) {
                map[i][j] = FLOOR_SEEN;
            }
        }
    }

    lcd.clear();
    lcd.printString("You find a map", 0, 0);
    lcd.printString("of the current", 0, 1);
    lcd.printString("level inside", 0, 2);
    lcd.printString("the chest", 0, 3);
    lcd.refresh();
    wait(1.0);
    Sleep();
}

void Potion()
{

    int p = rand()%5; //0- Poison, 1- Teleport, Else- Full heal

    lcd.clear();
    lcd.printString("You find a", 0, 0);
    lcd.printString("potion inside", 0, 1);
    lcd.printString("the chest", 0, 2);
    lcd.printString("Drink (Action)", 0, 4);
    lcd.printString("Leave (Other)", 0, 5);
    lcd.refresh();
    wait(1.0);
    Sleep();

    if(ActFlag) { //Potion drunk
        ActFlag = 0;

        if(p == 0) { //Poison

            int damage = rand()%4 + 1;

            ph = ph - damage;

            char buffer[15];
            int write = sprintf(buffer, "%d damage", damage);

            lcd.clear();
            lcd.printString("You drink the", 0, 0);
            lcd.printString("potion and", 0, 1);
            lcd.printString("suddenly feel", 0, 2);
            lcd.printString("ill.", 0, 3);
            lcd.printString("You take", 0, 4);
            lcd.printString(buffer, 0, 5);
            lcd.refresh();
            wait(1.0);
            Sleep();

            //Check if player is dead
            if(ph < 0) {
                GameOver();
            }
        } else if(p == 1) { //Teleport

            lcd.clear();
            lcd.printString("You drink the", 0, 0);
            lcd.printString("potion and", 0, 1);
            lcd.printString("suddenly feel", 0, 2);
            lcd.printString("your body", 0, 3);
            lcd.printString("being", 0, 4);
            lcd.printString("transported", 0, 5);
            lcd.refresh();
            wait(1.0);
            Sleep();

            GameLoop();

        } else { //Full heal

            ph = 15;

            lcd.clear();
            lcd.printString("You drink the", 0, 0);
            lcd.printString("potion and", 0, 1);
            lcd.printString("suddenly feel", 0, 2);
            lcd.printString("all your", 0, 3);
            lcd.printString("wounds heal", 0, 4);
            lcd.refresh();
            wait(1.0);
            Sleep();
        }
    } else { //Leave the potion
        DirFlag = 0;
        StartFlag = 0;
        lcd.clear();
        lcd.printString("You walk away", 0, 0);
        lcd.printString("and leave the", 0, 1);
        lcd.printString("potion", 0, 2);
        lcd.refresh();
        wait(1.0);
        Sleep();
    }
}

void Chest()
{
    int c = rand()%4; //0- Item, 1- Booby trap, 2- Map, Else- Potion

    if(c == 0) {
        getItem();
    } else if(c == 1) {
        BoobyTrap();
    } else if(c == 2) {
        RevealMap();
    } else {
        Potion();
    }

    map[px][py] = CHEST_OPENED;

}

void GameLoop()
{
    while(1) {

        level++;

        World();

        LevelScreen();

        while(1) {

            ActFlag = 0;
            StartFlag = 0;
            DirFlag = 0;

            PlayerCamera();

            if(map[px][py] == CHEST) {
                Chest();
            }

            if(px == exx && py == exy) {

                break;

            }

            Sleep();


            if(DirFlag) {

                DirFlag = 0;

                PlayerMove();

                if(rand()%35 == 0) {
                    Fight();
                }

            }
            if(StartFlag) {

                StartFlag = 0;

                StartMenu();
            }
            if(ActFlag) {

                ActFlag = 0;
            }
        }
    }
}

void MainMenu()
{
    level = 0;

    //Player Health
    ph = 15;

    //Player weapon
    pw = 0; //0 to 4

    //Player armour
    pa = 5; //5 to 9

    bool menu = 0;

    while(1) {
        lcd.clear();
        if(menu == 0) {
            lcd.printString("New Game <", 20, 1);
            lcd.printString("Options",20,3);
            lcd.refresh();
            Sleep();
        } else {
            lcd.printString("New Game", 20, 1);
            lcd.printString("Options <",20,3);
            lcd.refresh();
            Sleep();
        }

        if(DirFlag) {

            DirFlag = 0;

            menu = !menu;
        }
        if(ActFlag) {

            ActFlag = 0;

            if(menu == 0) {
                GameLoop();
            }
        }
    }
}

int main()
{
    //Power Saving
    PHY_PowerDown ();
    int result = semihost_powerdown();

    Up.rise(&DirPressed);
    Down.rise(&DirPressed);
    Right.rise(&DirPressed);
    Left.rise(&DirPressed);
    Start.rise(&StartPressed);
    Act.rise(&ActPressed);

    //Generate random seed
    srand(Noise*1000000);

    //Initilize screen
    lcd.init();

    Intro();

    MainMenu();

}