Thomas Gill / Mbed 2 deprecated LabyrinthOfTheMinotaur

Dependencies:   N5110 PowerControl mbed

Revision:
13:2195ec8bc9ff
Parent:
12:30a242706847
Child:
14:55802ce40285
--- a/main.cpp	Sat Apr 25 14:35:27 2015 +0000
+++ b/main.cpp	Fri May 01 11:46:28 2015 +0000
@@ -47,15 +47,38 @@
 };
 
 struct ITEMS {
-    char  ItemName[14]; // Symbol for this tile
-    bool   isWeapon; // Can tile be walked on
+    char  ItemName[15]; //Item name
+    int ItemValue; //Damage/ armour value
 };
 
 ITEMS  ItemList[] = {
-    { "Sword", true },  //
-    //{ 'Sword', true},  //
+    //Weapons
+    { "Dagger", 3},  //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
+};
+
+ENEMIES  EnemyList[] = {
+    {"Huge Rat", 5, 3, 0, 25, 70 },  //0- Huge Rat
+    {"Skeleton", 10, 5, 3, 10, 50}, //1- Skeleton
+};
 
 //Variables
 int ActFlag = 0;
@@ -76,8 +99,6 @@
 int sy;
 int dir;
 
-int n;
-
 int level;
 
 //Space type player is on
@@ -87,6 +108,15 @@
 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()
 {
@@ -105,10 +135,11 @@
 }
 void DirPressed()
 {
+    DirFlag = 1;
+}
 
-    DirFlag = 1;
-
-}
+//Voids
+void MainMenu();
 
 void Walls()
 {
@@ -133,15 +164,14 @@
 
 void FlashPlayerLocation()
 {
-
     lcd.setPixel(px,py);
     lcd.refresh();
     wait(0.5);
     lcd.clearPixel(px,py);
     lcd.refresh();
     wait(0.5);
+}
 
-}
 
 void DrawMap()
 {
@@ -155,7 +185,6 @@
             }
         }
     }
-
     lcd.refresh();
 }
 
@@ -197,6 +226,7 @@
     exx = rand()%sw + si;
     exy = rand()%sh + sj;
     map[exx][exy] = EXIT;
+
 }
 
 void DungeonRoomBuilder()
@@ -227,30 +257,32 @@
             }
         }
     }
-    if(rand()%2) {
+    if(rand()%4 == 0) {
         int i = rand()%sw + sx;
         int j = rand()%sh + sy;
         map[i][j] = CHEST;
     }
 }
 
-void Neighbours()
+int Neighbours(int i, int j)
 {
     //Check neighbours
-    n = 0;
+    int n = 0;
 
-    if(map[sx+1][sy] == FLOOR) {
+    if(map[i+1][j] == FLOOR) {
         n++;
     }
-    if(map[sx-1][sy] == FLOOR) {
+    if(map[i-1][j] == FLOOR) {
+        n++;
+    }
+    if(map[i][j+1] == FLOOR) {
         n++;
     }
-    if(map[sx][sy+1] == FLOOR) {
+    if(map[i][j-1] == FLOOR) {
         n++;
     }
-    if(map[sx][sy-1] == FLOOR) {
-        n++;
-    }
+
+    return n;
 }
 
 void DeadEnds(int d)
@@ -259,12 +291,7 @@
         for(int i = 0; i < 84; i++) {
             for(int j = 0; j < 48; j++) {
 
-                sx = i;
-                sy = j;
-
-                Neighbours();
-
-                if(n < 2) {
+                if(Neighbours(i , j) < 2) {
                     map[i][j] = WALL;
                 }
             }
@@ -433,23 +460,186 @@
             px--;
         }
     }
+}
+
+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) {
+                        mh = mh - damage; //Apply damage and calculate the monster's health
+                    }
+                }
+
+                if(mh <= 0) {
+                    lcd.clear();
+                    lcd.printString("You win!", 0, 0);
+                    lcd.refresh();
+                    Sleep();
+                    break;
+                }
+
+                //Get hit
+                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) {
+                        ph = ph - damage; //Apply damage and calculate the monster's health
+                    }
+                }
+
+                if(ph <= 0) {
+                    lcd.clear();
+                    lcd.printString("GAME OVER", 0, 0);
+                    lcd.refresh();
+                    Sleep();
+                    MainMenu();
+                }
 
 
+            } else { //Run away
+                lcd.clear();
+                lcd.printString("You run away", 6, 2);
+                lcd.refresh();
+                Sleep();
+                break;
+            }
+        }
+    }
+}
+
+void Map()
+{
+    lcd.clear();
+    DrawMap();
+    while(!StartFlag) {
+        FlashPlayerLocation();
+    }
+    StartFlag = 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();
+    Sleep();
 }
 
 void StartMenu()
 {
+    int menu = 0;
 
-    if(Start) {
-        lcd.clear();
-        DrawMap();
-        while(!StartFlag) {
-            FlashPlayerLocation();
+    while(1) {
+        if(menu == 0) {
+            lcd.clear();
+            lcd.printString("Map <", 6, 0);
+            lcd.printString("Inventory", 6, 2);
+            lcd.printString("Exit", 6, 4);
+            lcd.refresh();
+            Sleep();
+        } else if (menu == 1) {
+            lcd.clear();
+            lcd.printString("Map", 6, 0);
+            lcd.printString("Inventory <", 6, 2);
+            lcd.printString("Exit", 6, 4);
+            lcd.refresh();
+            Sleep();
+        } else if (menu == 2) {
+            lcd.clear();
+            lcd.printString("Map", 6, 0);
+            lcd.printString("Inventory", 6, 2);
+            lcd.printString("Exit <", 6, 4);
+            lcd.refresh();
+            Sleep();
         }
-        StartFlag = 0;
+
+        if(DirFlag) {
+            DirFlag = 0;
+            if((Down || Right) && menu < 2) {
+                menu++;
+            } else if((Up ||Left) && menu > 0)
+                menu--;
+        }
+        if(ActFlag) {
+            ActFlag = 0;
+            if(menu == 0) {
+                Map();
+            } else if(menu == 1) {
+                Inventory();
+            } else {
+                break;
+            }
+        }
     }
 }
 
+
 void Intro()
 {
     lcd.clear();
@@ -473,38 +663,61 @@
 
 void Chest()
 {
+    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[0].ItemName, 54, 2);
-    lcd.printString("-Yes (Action)", 0, 3);
-    lcd.printString("-No (Other)", 0, 4);
-    lcd.refresh();
-    Sleep();
+    while(1) {
+        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();
+        Sleep();
 
 
-    if(ActFlag) {
+        if(ActFlag) {
+
+            ActFlag = 0;
 
-        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();
+            map[px][py] = CHEST_OPENED;
+            break;
+        }
+        if(DirFlag) {
 
-        lcd.clear();
-        lcd.printString("You take the", 6, 1);
-        lcd.printString(ItemList[0].ItemName, 24, 2);
-        lcd.refresh();
+            DirFlag = 0;
+
+            lcd.clear();
+            lcd.printString("You leave the", 0, 1);
+            lcd.printString(ItemList[r].ItemName, 0, 2);
+            lcd.refresh();
+            map[px][py] = CHEST_OPENED;
+            break;
+        }
+        if(StartFlag) {
+            StartFlag = 0;
+
+            lcd.clear();
+            lcd.printString("You leave the", 0, 1);
+            lcd.printString(ItemList[r].ItemName, 0, 2);
+            lcd.refresh();
+            map[px][py] = CHEST_OPENED;
+            break;
+        }
+
     }
-    if(DirFlag) {
-
-        DirFlag = 0;
-
-        lcd.clear();
-        lcd.printString("You leave the", 3, 1);
-        lcd.printString(ItemList[0].ItemName, 24, 2);
-        lcd.refresh();
-    }
-    map[px][py] = CHEST_OPENED;
 }
 
 void GameLoop()
@@ -540,6 +753,11 @@
                 DirFlag = 0;
 
                 PlayerMove();
+
+                if(rand()%35 == 0) {
+                    Fight();
+                }
+
             }
             if(StartFlag) {
 
@@ -547,12 +765,27 @@
 
                 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) {
@@ -575,11 +808,13 @@
 
             menu = !menu;
         }
-        if(ActFlag && menu == 0) {
+        if(ActFlag) {
 
             ActFlag = 0;
 
-            GameLoop();
+            if(menu == 0) {
+                GameLoop();
+            }
         }
     }
 }