Thomas Gill / Mbed 2 deprecated LabyrinthOfTheMinotaur

Dependencies:   N5110 PowerControl mbed

Revision:
21:aa4feee6aa39
Parent:
20:e54792b89571
Child:
22:dae750e4d749
--- a/main.cpp	Mon May 04 16:26:43 2015 +0000
+++ b/main.cpp	Mon May 04 17:16:31 2015 +0000
@@ -4,14 +4,14 @@
 #include "WorldBuilder.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);
+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)
 
@@ -22,12 +22,12 @@
 
 TILES  TileList[] = {
     { '#', false },  // 0- WALL
-    { '.', true},  // 1- FLOOR
+    { '.', true },  // 1- FLOOR
     { '+', true }, // 2- ENTER
     { 'x', true },  // 3- EXIT
-    { '.', true},  // 4- FLOOR_SEEN
-    { '=', true},  // 5- CHEST
-    { '/', true},  // 6- CHEST_OPENED
+    { '.', true },  // 4- FLOOR_SEEN
+    { '=', true },  // 5- CHEST
+    { '/', true },  // 6- CHEST_OPENED
 };
 
 struct ITEMS {
@@ -37,17 +37,17 @@
 
 ITEMS  ItemList[] = {
     //Weapons
-    { "Dagger", 4},  //0
-    { "Axe", 5},  //1
-    { "Mace", 6},  //2
-    { "Sword", 7},  //3
-    { "Warhammer", 10}, //4
+    { "Dagger", 4 },  //0
+    { "Axe", 5 },  //1
+    { "Mace", 6 },  //2
+    { "Sword", 7 },  //3
+    { "Warhammer", 8 }, //4
     //Armour
-    { "Cloth armour", 1},  //5
-    { "Leather armour", 2},  //6
-    { "Studded armour", 3},  //7
-    { "Chainmail vest", 4}, //8
-    { "Plate armour", 5}, //9
+    { "Cloth armour", 1 },  //5
+    { "Leather armour", 2 },  //6
+    { "Studded armour", 3 },  //7
+    { "Chainmail vest", 4 }, //8
+    { "Plate armour", 5 }, //9
 };
 
 struct ENEMIES {
@@ -62,12 +62,12 @@
 
 ENEMIES  EnemyList[] = {
     //Name          HP Dmg Arm  Dg  Ht  Spd
-    {"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
-    {"Wraith",      5,  4,  0,  40, 60, 50}, //3- Wraith
-    {"Ogre",        10, 7,  3,  10, 35, 15}, //4- Ogre
-    {"Minotaur",    15, 8,  5,  20, 45, 100}, //5- Minotaur
+    { "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
+    { "Wraith", 5, 4, 0, 40, 60, 50 }, //3- Wraith
+    { "Ogre", 10, 7, 3, 10, 35, 15 }, //4- Ogre
+    { "Minotaur", 15, 8, 5, 20, 45, 100 }, //5- Minotaur
 };
 
 //Variables
@@ -78,10 +78,6 @@
 //Space type player is on
 int pSpace;
 
-//Player coordinates
-int px;
-int py;
-
 //Player Health
 int ph = 15;
 
@@ -113,49 +109,157 @@
 }
 
 //Voids
+void Intro();
 void MainMenu();
+void LevelScreen();
 void GameLoop();
+void PlayerCamera();
+void PlayerMove();
+void Fight();
+void MonsterAttack(int m);
+void StartMenu();
+void Map();
+void DrawMap();
+void FlashPlayerLocation();
+void MapLegend();
+void Inventory();
+void Chest();
+void getItem();
+void BoobyTrap();
+void RevealMap();
+void Potion();
+void GameOver();
 
-void FlashPlayerLocation()
+void Intro()
 {
-    lcd.setPixel(px,py);
+    lcd.clear();
+    lcd.printString("TBG RPG", 20, 2);
     lcd.refresh();
-    wait(0.5);
-    lcd.clearPixel(px,py);
-    lcd.refresh();
-    wait(0.5);
+    wait(1.0);
 }
 
-
-void DrawMap()
+void MainMenu()
 {
-    //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);
+    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();
             }
         }
     }
+}
+
+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 World()
+}
+
+void GameLoop()
 {
-    Walls();
-    if(level == 5) {
-        LabyrinthBuilder();
-    } else {
-        DungeonBuilder();
-        //LabyrinthBuilder();
+    while (1) {
+
+        level++;
+
+        World();
+
+        LevelScreen();
+
+        RevealMap();
+
+        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() % 60 == 0) {
+                    if (ph < 15) {
+                        ph++;
+                    }
+                }
+
+                if (rand() % 50 == 0) {
+                    Fight();
+                }
+
+            }
+            if (StartFlag) {
+
+                StartFlag = 0;
+
+                StartMenu();
+            }
+            if (ActFlag) {
+
+                ActFlag = 0;
+            }
+        }
     }
-
-    px = enx;
-    py = eny;
-
-    wait(1.0);
 }
 
 void PlayerCamera()
@@ -164,24 +268,26 @@
 
     int tile;
 
-    for(int i = 0; i < 14; i++) {
-        for(int j = 0; j < 6; j++) {
+    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 {
+            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 {
+                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);
+                lcd.printChar(TileList[tile].Symbol, (6 * i) + 1, j);
 
-                if(map[px+diffx][py+diffy] == FLOOR) {
-                    map[px+diffx][py+diffy] = FLOOR_SEEN;
+                if (map[px + diffx][py + diffy] == FLOOR) {
+                    map[px + diffx][py + diffy] = FLOOR_SEEN;
                 }
 
             }
@@ -192,90 +298,42 @@
 
 void PlayerMove()
 {
-    if(Up) {
-        int tile = map[px][py-1];
-        if(TileList[tile].Passable) {
+    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) {
+    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) {
+    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) {
+    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+1);
+    int m = rand() % (level + 1);
 
     int mh = EnemyList[m].EHealth;
 
     lcd.clear();
     lcd.printString("FIGHT!", 24, 2);
 
-    for(int i = 0; i<5; i++) {
+    for (int i = 0; i<5; i++) {
         lcd.inverseMode();
         lcd.refresh();
         wait(0.2);
@@ -286,7 +344,7 @@
 
     bool menu = 1;
 
-    while(1) {
+    while (1) {
         ActFlag = 0;
         StartFlag = 0;
         DirFlag = 0;
@@ -295,62 +353,64 @@
 
         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
+        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
+        write = sprintf(buffer2, "%d/15", ph); // print formatted data to buffer
         lcd.printString(buffer2, 54, 2);
 
-        if(menu) {
+        if (menu) {
             lcd.printString("Fight <", 0, 4);
             lcd.printString("Run", 0, 5);
-        } else {
+        }
+        else {
             lcd.printString("Fight", 0, 4);
             lcd.printString("Run <", 0, 5);
         }
         lcd.refresh();
         Sleep();
 
-        if(DirFlag) {
+        if (DirFlag) {
             DirFlag = 0;
             menu = !menu;
         }
-        if(ActFlag) {
+        if (ActFlag) {
             ActFlag = 0;
-            if(menu) { //Fight
+            if (menu) { //Fight
                 //Hit monster
-                if(rand()%100 + 1 > EnemyList[m].EDodge) { //If monster doesn't dodge
+                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
+                    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
+                    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("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
+                }
+                else { //Monster dodges
                     lcd.clear();
-                    lcd.printString(EnemyList[m].EName, 0 ,1);
-                    lcd.printString("dodges your", 0 , 2);
-                    lcd.printString("attack", 0 , 3);
+                    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
+                if (mh <= 0) { //Check if monster is dead
                     lcd.clear();
                     lcd.printString("You win!", 18, 2);
                     lcd.refresh();
@@ -362,11 +422,12 @@
                 MonsterAttack(m);
 
 
-            } else { //Run away
+            }
+            else { //Run away
 
-                int b = rand()%5;
+                int b = rand() % 5;
 
-                if(b == 0) { //Monster blocks the path
+                if (b == 0) { //Monster blocks the path
 
                     lcd.clear();
                     lcd.printString("You try to run", 0, 0);
@@ -379,11 +440,12 @@
 
                     MonsterAttack(m);
 
-                } else {
+                }
+                else {
 
-                    int s = rand()%100 + 1;
+                    int s = rand() % 100 + 1;
 
-                    if(s > EnemyList[m].ESpd) { //If you outspeed monster
+                    if (s > EnemyList[m].ESpd) { //If you outspeed monster
 
                         lcd.clear();
                         lcd.printString("You run away", 6, 2);
@@ -392,7 +454,8 @@
                         Sleep();
                         break;
 
-                    } else {
+                    }
+                    else {
 
                         lcd.clear();
                         lcd.printString("You try to run", 0, 0);
@@ -415,77 +478,41 @@
     }
 }
 
-void Map()
-{
-    lcd.clear();
-    DrawMap();
-    while(!StartFlag) {
-        FlashPlayerLocation();
-    }
-    StartFlag = 0;
-    ActFlag = 0;
-    DirFlag = 0;
-}
-
-
-void Inventory()
+void MonsterAttack(int m)
 {
-    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);
+    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
 
-    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();
+        char buffer[14];
+        int write = sprintf(buffer, "%d damage", damage); // print formatted data to buffer
 
-    while(1) {
+        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();
 
-        if(ActFlag) {
-            ActFlag = 0;
-        }
-        if(DirFlag) {
-            DirFlag = 0;
-            break;
-        }
-        if(StartFlag) {
-            StartFlag = 0;
-            break;
-        }
     }
-}
+    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 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()
@@ -493,11 +520,11 @@
     int menu = 0;
 
     char buffer[14];
-    int write = sprintf(buffer,"Health  %d/15",ph); // print formatted data to buffer
+    int write = sprintf(buffer, "Health  %d/15", ph); // print formatted data to buffer
 
 
-    while(1) {
-        if(menu == 0) {
+    while (1) {
+        if (menu == 0) {
             lcd.clear();
             lcd.printString(buffer, 0, 0);
             lcd.printString("Map <", 0, 2);
@@ -506,7 +533,8 @@
             lcd.printString("Continue", 0, 5);
             lcd.refresh();
             Sleep();
-        } else if (menu == 1) {
+        }
+        else if (menu == 1) {
             lcd.clear();
             lcd.printString(buffer, 0, 0);
             lcd.printString("Map", 0, 2);
@@ -515,7 +543,8 @@
             lcd.printString("Continue", 0, 5);
             lcd.refresh();
             Sleep();
-        } else if (menu == 2) {
+        }
+        else if (menu == 2) {
             lcd.clear();
             lcd.printString(buffer, 0, 0);
             lcd.printString("Map", 0, 2);
@@ -524,7 +553,8 @@
             lcd.printString("Continue", 0, 5);
             lcd.refresh();
             Sleep();
-        } else if (menu == 3) {
+        }
+        else if (menu == 3) {
             lcd.clear();
             lcd.printString(buffer, 0, 0);
             lcd.printString("Map", 0, 2);
@@ -535,57 +565,158 @@
             Sleep();
         }
 
-        if(DirFlag) {
+        if (DirFlag) {
             DirFlag = 0;
-            if((Down || Right) && menu < 3) {
+            if ((Down || Right) && menu < 3) {
                 menu++;
-            } else if((Up ||Left) && menu > 0)
+            }
+            else if ((Up || Left) && menu > 0)
                 menu--;
         }
-        if(ActFlag) {
+        if (ActFlag) {
             ActFlag = 0;
-            if(menu == 0) {
+            if (menu == 0) {
                 Map();
-            } else if(menu == 1) {
+            }
+            else if (menu == 1) {
                 MapLegend();
-            } else if(menu == 2) {
+            }
+            else if (menu == 2) {
                 Inventory();
-            } else {
+            }
+            else {
                 break;
             }
         }
-        if(StartFlag) {
+        if (StartFlag) {
             StartFlag = 0;
         }
     }
 }
 
-
-void Intro()
+void Map()
 {
     lcd.clear();
-    lcd.printString("TBG RPG", 20, 2);
+    DrawMap();
+    while (!StartFlag) {
+        FlashPlayerLocation();
+    }
+    StartFlag = 0;
+    ActFlag = 0;
+    DirFlag = 0;
+}
+
+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();
-    wait(1.0);
+}
+
+void FlashPlayerLocation()
+{
+    lcd.setPixel(px, py);
+    lcd.refresh();
+    wait(0.5);
+    lcd.clearPixel(px, py);
+    lcd.refresh();
+    wait(0.5);
 }
 
-void LevelScreen()
+void MapLegend()
 {
-    char buffer[14];
+    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 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);
 
-    int write = sprintf(buffer,"Level %d",level); // print formatted data to buffer
+    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();
 
-    lcd.clear();
-    lcd.printString(buffer, 20, 2);
-    lcd.refresh();
-    wait(1.0);
+        if (ActFlag) {
+            ActFlag = 0;
+        }
+        if (DirFlag) {
+            DirFlag = 0;
+            break;
+        }
+        if (StartFlag) {
+            StartFlag = 0;
+            break;
+        }
+    }
+}
+
+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 getItem()
 {
 
-    int r = rand()%10;
+    int r = rand() % 10;
 
     DirFlag = 0;
 
@@ -600,13 +731,14 @@
     Sleep();
 
 
-    if(ActFlag) {
+    if (ActFlag) {
 
         ActFlag = 0;
 
         if (r > 5) {
             pa = r;
-        } else {
+        }
+        else {
             pw = r;
         }
 
@@ -617,7 +749,8 @@
         wait(1.0);
         Sleep();
 
-    } else {
+    }
+    else {
 
         StartFlag = 0;
         DirFlag = 0;
@@ -634,9 +767,9 @@
 void BoobyTrap()
 {
 
-    int damage = rand()%5;
+    int damage = rand() % 5;
 
-    if(damage != 0) {
+    if (damage != 0) {
 
         ph = ph - damage;
 
@@ -653,10 +786,11 @@
         Sleep();
 
         //Check if player is dead
-        if(ph < 0) {
+        if (ph < 0) {
             GameOver();
         }
-    } else {
+    }
+    else {
 
         lcd.clear();
         lcd.printString("The chest is", 0, 0);
@@ -673,10 +807,10 @@
 void RevealMap()
 {
 
-    for(int i = 0; i < 84; i++) {
-        for(int j = 0; j < 48; j++) {
+    for (int i = 0; i < 84; i++) {
+        for (int j = 0; j < 48; j++) {
 
-            if(map[i][j] == FLOOR) {
+            if (map[i][j] == FLOOR) {
                 map[i][j] = FLOOR_SEEN;
             }
         }
@@ -695,7 +829,7 @@
 void Potion()
 {
 
-    int p = rand()%5; //0- Poison, 1- Teleport, Else- Full heal
+    int p = rand() % 5; //0- Poison, 1- Teleport, Else- Full heal
 
     lcd.clear();
     lcd.printString("You find a", 0, 0);
@@ -707,12 +841,12 @@
     wait(1.0);
     Sleep();
 
-    if(ActFlag) { //Potion drunk
+    if (ActFlag) { //Potion drunk
         ActFlag = 0;
 
-        if(p == 0) { //Poison
+        if (p == 0) { //Poison
 
-            int damage = rand()%4 + 1;
+            int damage = rand() % 4 + 1;
 
             ph = ph - damage;
 
@@ -731,10 +865,11 @@
             Sleep();
 
             //Check if player is dead
-            if(ph < 0) {
+            if (ph < 0) {
                 GameOver();
             }
-        } else if(p == 1) { //Teleport
+        }
+        else if (p == 1) { //Teleport
 
             lcd.clear();
             lcd.printString("You drink the", 0, 0);
@@ -749,7 +884,8 @@
 
             GameLoop();
 
-        } else { //Full heal
+        }
+        else { //Full heal
 
             ph = 15;
 
@@ -763,7 +899,8 @@
             wait(1.0);
             Sleep();
         }
-    } else { //Leave the potion
+    }
+    else { //Leave the potion
         DirFlag = 0;
         StartFlag = 0;
         lcd.clear();
@@ -776,138 +913,24 @@
     }
 }
 
-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()
+void GameOver()
 {
-    while(1) {
-
-        level++;
-
-        World();
-
-        LevelScreen();
-
-        RevealMap();
-
-        while(1) {
-
-            ActFlag = 0;
-            StartFlag = 0;
-            DirFlag = 0;
-
-            PlayerCamera();
-
-            if(map[px][py] == CHEST) {
-                Chest();
-            }
-
-            if(px == exx && py == exy) {
-
-                break;
-
-            }
-
-            Sleep();
+    lcd.inverseMode();
+    lcd.clear();
+    lcd.printString("GAME OVER", 12, 2);
+    lcd.refresh();
+    wait(1.0);
+    Sleep();
+    lcd.normalMode();
+    MainMenu();
+}
 
 
-            if(DirFlag) {
-
-                DirFlag = 0;
-
-                PlayerMove();
-
-                if(rand()%60 == 0) {
-                    if(ph < 15) {
-                        ph++;
-                    }
-                }
-
-                if(rand()%50 == 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 ();
+    PHY_PowerDown();
     int result = semihost_powerdown();
 
     Up.rise(&DirPressed);
@@ -918,7 +941,7 @@
     Act.rise(&ActPressed);
 
     //Generate random seed
-    srand(Noise*1000000);
+    srand(Noise * 1000000);
 
     //Initilize screen
     lcd.init();
@@ -926,4 +949,4 @@
     Intro();
 
     MainMenu();
-}
+}
\ No newline at end of file