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
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(); }