Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: N5110 PowerControl mbed
Diff: main.cpp
- 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(); + } } } }