diff --git a/include/level.hpp b/include/level.hpp index c39262b..a48ebd4 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -24,6 +24,7 @@ private: GravityDirection gravity_direction; sf::String name; + std::string current_file; int total_time; sf::Sprite background_sprite; @@ -58,14 +59,24 @@ public: virtual ~Level(); /** - * Charge un niveau de jeu avec le nom donné + * Charge le niveau par défaut */ - virtual void load(std::string filename); + void load(); /** - * Sauvegarde la configuration actuelle dans le niveau donné + * Charge le niveau de jeu donné */ - virtual void save(std::string filename); + void load(std::string filename); + + /** + * Écrase le niveau chargé avec les données en mémoire + */ + void save(); + + /** + * Sauvegarde la configuration actuelle dans le fichier donné + */ + void save(std::string filename); /** * Appelé par le manager lorsque l'état est utilisé diff --git a/src/editor.cpp b/src/editor.cpp index 38548ec..53c6592 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -29,11 +29,7 @@ inline sf::Vector2f roundVectorToGrid(sf::Vector2f input) { Editor::Editor(Manager& manager) : Level(manager), drag_control_point(nullptr), drag_mode(Editor::DragMode::NONE), widget_timer(manager, true, std::bind(&Editor::setTotalTime, this, std::placeholders::_1)), - widget_toolbar(manager) { - - setName("Nouveau niveau"); - setTotalTime(30); -} + widget_toolbar(manager) {} Editor::~Editor() {} diff --git a/src/level.cpp b/src/level.cpp index 7df335d..a8f1a21 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -3,6 +3,7 @@ #include "player.hpp" #include "block.hpp" #include "gravity_block.hpp" +#include #include #include #include @@ -33,11 +34,44 @@ std::map> object_type_m {GravityBlock::TYPE_ID, GravityBlock::load} }; -Level::Level(Manager& manager) : State(manager) {} +Level::Level(Manager& manager) : State(manager) { + camera.setCenter(0, 0); +} + Level::~Level() {} +void Level::load() { + // métadonnées par défaut + name = sf::String("Nouveau niveau"); + current_file = ""; + total_time = 30; + + // zone de jeu par défaut + zone.clear(); + zone.push_back(sf::Vector2f(-128, -128)); + zone.push_back(sf::Vector2f(128, -128)); + zone.push_back(sf::Vector2f(128, 128)); + zone.push_back(sf::Vector2f(-128, 128)); + + // ressources par défaut + music = ""; + background = ""; + + // objets par défaut + // TODO: ajouter quelques objets par défaut +} + void Level::load(std::string filename) { std::ifstream file; + std::string full_path = getResourceManager().getLevelPath(filename); + + // si le fichier n'existe pas, on utilise le niveau par défaut + if (!boost::filesystem::exists(full_path)) { + load(); + return; + } + + // sinon, on charge les propriétés depuis le fichier file.open( getResourceManager().getLevelPath(filename), std::ios::binary | std::ios::in @@ -51,18 +85,15 @@ void Level::load(std::string filename) { ); } - // vidage du niveau précédent et positionnement - // de la caméra au centre du niveau - objects.clear(); - camera.setCenter(0, 0); - // lecture de la signture du fichier ("BAR") + current_file = filename; char signature[3]; file.read(signature, 3); if (strncmp(signature, "BAR", 3) != 0) { throw std::runtime_error( - "Impossible de lire le fichier : en-tête invalide" + "Impossible de charger le niveau \"" + name + "\" " + + "(en-tête invalide)" ); } @@ -72,7 +103,8 @@ void Level::load(std::string filename) { if (file_version != VERSION_NUMBER) { throw std::runtime_error( - "Impossible de lire le fichier : version non prise en charge" + "Impossible de charger le niveau \"" + name + "\" " + + "(version non prise en charge)" ); } @@ -120,7 +152,8 @@ void Level::load(std::string filename) { // pour éviter une erreur de segmentation if (object_type_map.count(object_type) == 0) { throw std::runtime_error( - "Impossible de lire le fichier : type d'objet inconnu" + "Impossible de charger le niveau \"" + name + "\" " + + "(type d'objet " + std::to_string(object_type) + " inconnu)" ); } @@ -192,11 +225,14 @@ void Level::save(std::string filename) { } } +void Level::save() { + save(current_file); +} + void Level::begin() { sf::Vector2u window_size = getWindow().getSize(); camera.setSize(window_size.x, window_size.y); camera_angle = 180.f; - gravity_direction = GravityDirection::SOUTH; } diff --git a/src/menu.cpp b/src/menu.cpp index 14cc036..3a66ff9 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -183,7 +183,7 @@ void Menu::launchEditor() { std::shared_ptr editor = std::shared_ptr(new Editor(getManager())); // TODO: charger dynamiquement le niveau - editor->load("level1.dat"); + editor->load(); getManager().setState(editor); }