summaryrefslogtreecommitdiff
path: root/source/data/LevelReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/data/LevelReader.cpp')
-rw-r--r--source/data/LevelReader.cpp54
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();
+}