fix for star not changing music, thanks to Ondra Hosek for the patch
[supertux.git] / src / leveleditor.cpp
index f17fbe1..198c0c2 100644 (file)
 #include "leveleditor.h"
 #include "resources.h"
 #include "tile.h"
-#include "tilemap.h"
 #include "tile_manager.h"
 #include "sector.h"
-#include "background.h"
 #include "gameloop.h"
-#include "badguy.h"
-#include "gameobjs.h"
-#include "camera.h"
+#include "object/gameobjs.h"
+#include "object/camera.h"
+#include "object/tilemap.h"
+#include "object/background.h"
 
 LevelEditor::LevelEditor()
 {
   show_grid = true;
 
   selection.clear();
-  global_frame_counter = 0;
   selection_end = selection_ini = Vector(0,0);
   left_button = middle_button = mouse_moved =  false;
   level = 0;
@@ -103,21 +101,15 @@ LevelEditor::LevelEditor()
   tiles_board = new ButtonGroup(Vector(screen->w - 140, 100),
             Vector(32,32), Vector(4,8));
 
-  TileManager* tilemanager = TileManager::instance();
-
   tiles_board->add_button(Button(img_rubber_bt, _("Eraser"), SDLKey(SDLK_DELETE)), 0);
-  for(unsigned int id = 1; id < tilemanager->get_max_tileid(); id++)
+  for(unsigned int id = 1; id < tile_manager->get_max_tileid(); id++)
     {
-    const Tile* tile = tilemanager->get(id);
+    const Tile* tile = tile_manager->get(id);
     if(!tile)
       continue;
 
-    Surface* surface;
-    if(tile->editor_images.size())
-      surface = tile->editor_images[0];
-    else if(tile->images.size())
-      surface = tile->images[0];
-    else
+    Surface* surface = tile->get_editor_image();
+    if(!surface)
       continue;
 
     Button button = Button(surface, "", SDLKey(0));
@@ -233,7 +225,6 @@ else
 
 mouse_cursor->set_state(MC_NORMAL);
 
-frame_timer.start(.25, true);
 done = false;
 while(!done)
   {
@@ -291,7 +282,9 @@ while(SDL_PollEvent(&event))
         level_subset->description = create_subset_menu->get_item_by_id(MN_ID_DESCRIPTION_SUBSET).input;
         //FIXME: generate better level filenames
         level_subset->add_level(subset_name+'/'+"new_level.stl");
-        Level::create(level_subset->get_level_filename(0));
+        Level* newlevel = new Level();
+        newlevel->add_sector(create_sector("main", 25, 19));
+        newlevel->save(level_subset->get_level_filename(0));
         level_subset->save();
         
         load_level(0);
@@ -371,7 +364,9 @@ while(SDL_PollEvent(&event))
           if(confirm_dialog(NULL, str))
             {
             level_subset->add_level("new_level.stl");
-            Level::create(level_subset->get_level_filename(level_nb + 1));
+            Level* newlevel = new Level();
+            newlevel->add_sector(create_sector("main", 25, 19));
+            newlevel->save(level_subset->get_level_filename(level_nb + 1));
             level_subset->save();
             load_level(level_nb + 1);
             }
@@ -458,7 +453,7 @@ std::cerr << "previous sector.\n";
               {
               vector.push_back(tilemap->get_tile(x +
                (int)(((selection_ini.x+scroll.x)*zoom)/32),
-               y + (int)(((selection_ini.y+scroll.y)*zoom)/32))->id);
+               y + (int)(((selection_ini.y+scroll.y)*zoom)/32))->getID());
               }
             selection.push_back(vector);
             }
@@ -535,10 +530,6 @@ if(tiles_board->is_hover() || tiles_layer->is_hover() || level_options->is_hover
 
 if(sector)
   {
-    if(frame_timer.check()) {
-      ++global_frame_counter;
-    }
-
   // don't scroll before the start or after the level's end
   float width = sector->solids->get_width() * 32;
   float height = sector->solids->get_height() * 32;
@@ -649,10 +640,9 @@ if(sector)
         }
       else
         {
-        TileManager* tilemanager = TileManager::instance();
         for(unsigned int x = 0; x < selection.size(); x++)
           for(unsigned int y = 0; y < selection[x].size(); y++) {
-            const Tile* tile = tilemanager->get(selection[x][y]);
+            const Tile* tile = tile_manager->get(selection[x][y]);
             tile->draw(context,
                 Vector(event.button.x + x*32 - 8, event.button.y + y*32 - 8),
                 LAYER_GUI-2);
@@ -787,7 +777,7 @@ if(sector_ == NULL)
   {
   if(!confirm_dialog(NULL, _("No more sectors exist. Create another?")))
     return;
-  sector_ = Sector::create("new_sector",25,19);
+  sector_ = create_sector("new_sector",25,19);
   level->add_sector(sector_);
   }
 
@@ -862,6 +852,7 @@ void LevelEditor::test_level()
 
 void LevelEditor::change(int x, int y, int newtile, int layer)
 {  
+  (void) layer;
   // find the tilemap of the current layer, and then change the tile
   if(x < 0 || (unsigned int)x >= sector->solids->get_width()*32 ||
       y < 0 || (unsigned int)y >= sector->solids->get_height()*32)
@@ -941,7 +932,7 @@ mouse_cursor->set_state(MC_HIDE);
 
 
 char str[1024];
-char *text1[] = {
+const char *text1[] = {
          _("This is the built-in level editor. Its aim is to be intuitive\n"
          "and simple to use, so it should be pretty straightforward.\n"
          "\n"
@@ -977,7 +968,7 @@ char *text1[] = {
          "enemies and game objects in the bottom.\n")
                 };
 
-char *text2[] = {
+const char *text2[] = {
          _("The Foreground/Interactive/Background buttons may be used to\n"
          "see and edit the respective layer. Levels have three tiles layers:\n"
          "Foreground - tiles are drawn on top of everything and have no contact\n"
@@ -1010,7 +1001,7 @@ char *text2[] = {
          "Webpage: http://pingus.seul.org/~grumbel/flexlay/")
                 };
 
-char **text[] = { text1, text2 };
+const char **text[] = { text1, text2 };
 
 
 bool done;
@@ -1039,3 +1030,19 @@ for(unsigned int i = 0; i < sizeof(text) / sizeof(text[0]); i++)
 show_grid = show_grid_t;
 mouse_cursor->set_state(MC_NORMAL);
 }
+
+Sector*
+LevelEditor::create_sector(const std::string& name, size_t width, size_t height)
+{
+  Sector* sector = new Sector;
+  sector->set_name(name);
+  
+  sector->add_object(new TileMap(LAYER_BACKGROUNDTILES, false, width, height));
+  sector->add_object(new TileMap(LAYER_TILES, true, width, height));
+  sector->add_object(new TileMap(LAYER_FOREGROUNDTILES, false, width, height));
+  sector->add_object(new Camera(sector));
+  sector->update_game_objects();
+  
+  return sector;
+}
+