#include "maps.hpp" #include "data.hpp" #include "elements.hpp" #include "globals.hpp" #include #include #ifdef __APPLE__ #include #include namespace rv = ranges::views; #else #include namespace rv = std::views; #endif void Manager::clear() { for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) { delete wall_list[i][j]; wall_list[i][j] = nullptr; } } int Manager::get_active() { return _active; } void Manager::set_active(int level) { _active = level; } void Manager::set_next() { _active++; clear(); load(level_data[_active].data); } void Manager::set_previous() { _active--; clear(); load(level_data[_active].data); } void Manager::draw(sf::RenderWindow& window) { for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) { if (wall_list[i][j] == nullptr) continue; window.draw(wall_list[i][j]->rect); } } void Manager::load(const std::array, MAX_ROWS> map_data) { for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) { if (map_data[i][j] == ' ') continue; if (map_data[i][j] == '0') { wall_list[i][j] = new Object { object_data[0] }; wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j, wall_list[i][j]->rect.getPosition().y * i }); } if (map_data[i][j] == '1' && j + 1 < MAX_COLS && map_data[i][j + 1] == '2') { int start = j, end = j + 1; wall_list[i][j] = new Object { object_data[0] }; wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x * float(end - start + 1), wall_list[i][j]->rect.getSize().y }); wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j, wall_list[i][j]->rect.getPosition().y * i }); } if (map_data[i][j] == '1' && i + 1 < MAX_ROWS && map_data[i + 1][j] == '2') { int start = i, end = i + 1; wall_list[i][j] = new Object { object_data[0] }; wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x, wall_list[i][j]->rect.getSize().y * float(end - start + 1) }); wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j, wall_list[i][j]->rect.getPosition().y * i }); } if (map_data[i][j] == '1' && j + 1 < MAX_COLS && map_data[i][j + 1] == '-') { int start = j, end = j; while (end + 1 < MAX_COLS && map_data[i][end + 1] != '2') end++; if (map_data[i][end + 1] == '2') end++; wall_list[i][j] = new Object { object_data[0] }; wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x * float(end - start + 1), wall_list[i][j]->rect.getSize().y }); wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j, wall_list[i][j]->rect.getPosition().y * i }); } if (map_data[i][j] == '1' && i + 1 < MAX_ROWS && map_data[i + 1][j] == '|') { int start = i, end = i; while (end + 1 < MAX_ROWS && map_data[end + 1][j] != '2') end++; if (map_data[end + 1][j] == '2') end++; wall_list[i][j] = new Object { object_data[0] }; wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x, wall_list[i][j]->rect.getSize().y * float(end - start + 1) }); wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j, wall_list[i][j]->rect.getPosition().y * i }); } } }