diff options
Diffstat (limited to 'source/data/LevelReader.cpp')
-rw-r--r-- | source/data/LevelReader.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/data/LevelReader.cpp b/source/data/LevelReader.cpp new file mode 100644 index 0000000..e5364d8 --- /dev/null +++ b/source/data/LevelReader.cpp @@ -0,0 +1,54 @@ +#include "LevelReader.h" + +LevelReader::LevelReader(string filename) + :_filename(filename) +{} + +void LevelReader::readLevel(Maze& maze, list<PlayerCar>& players, list<EnemyCar>& enemies, list<Checkpoint>& checkpoints, list<Rock>& rocks) +{ + ifstream file(_filename.c_str()); + if (!file) + { + al_show_native_message_box(NULL, "Fatal error", "Fatal error", "The requested level file could not be opened.", NULL, ALLEGRO_MESSAGEBOX_ERROR); + throw FileOpenError(); + } + + int maxX = 0; + int maxY = 0; + + string line; + char element; + int y = 0; + vector <pair<int, int> > walls; + + while (!file.eof()) + { + getline (file, line); + + for (int x = 0; x < static_cast<int>(line.length()); ++x) + { + element = line.at(x); + switch (element) + { + case PLAYER_CHAR: players.push_back(PlayerCar(x,y)); + break; + case ENEMY_CHAR: enemies.push_back (EnemyCar(x,y)); + break; + case CHECKPOINT_CHAR: checkpoints.push_back(Checkpoint(x,y)); + break; + case ROCK_CHAR: rocks.push_back(Rock(x,y)); + break; + case WALL_CHAR: walls.push_back (make_pair(x,y)); + break; + } + if (maxX < x) maxX = x; + if (maxY < y) maxY = y; + } + + ++y; + } + + maze.generateMaze (walls, maxX, maxY); + + file.close(); +} |