-#include "music_manager.h"
-
-/* definitions to aid development */
-
-/* definitions that affect gameplay */
-#define KEY_CURSOR_SPEED 32
-#define KEY_CURSOR_FASTSPEED 64
-
-/* when pagedown/up pressed speed:*/
-#define PAGE_CURSOR_SPEED 13*32
-
-#define MOUSE_LEFT_MARGIN 80
-#define MOUSE_RIGHT_MARGIN (560-32)
-/* right_margin should noticed that the cursor is 32 pixels,
- so it should subtract that value */
-#define MOUSE_POS_SPEED 20
-
-/* look */
-#define SELECT_W 2 // size of the selections lines
-#define SELECT_CLR 0, 255, 0, 255 // lines color (R, G, B, A)
-
-/* own declerations */
-/* crutial ones (main loop) */
-int le_init();
-void le_quit();
-int le_load_level_subset(char *filename);
-void le_drawlevel();
-void le_drawinterface();
-void le_checkevents();
-void le_change(float x, float y, int tm, unsigned int c);
-void le_testlevel();
-void le_showhelp();
-void le_set_defaults(void);
-void le_activate_bad_guys(void);
-void le_goto_level(int levelnb);
-void le_highlight_selection();
-
-void apply_level_settings_menu();
-void update_subset_settings_menu();
-void save_subset_settings_menu();
-
-struct TileOrObject
+#include "tile.h"
+#include "tile_manager.h"
+#include "sector.h"
+#include "gameloop.h"
+#include "object_factory.h"
+#include "object/gameobjs.h"
+#include "object/camera.h"
+#include "object/tilemap.h"
+#include "object/background.h"
+
+LevelEditor::LevelEditor()
+{
+ show_grid = true;
+
+ selection.clear();
+ selection_end = selection_ini = Vector(0,0);
+ left_button = middle_button = mouse_moved = false;
+ level = 0;
+ level_subset = 0;
+
+ cur_layer = LAYER_TILES;
+ level_changed = false;
+
+ sector = 0;
+ zoom = 1.0;
+
+ /* Creating menus */
+ level_subsets = FileSystem::dsubdirs("/levels", "info");
+ subset_menu = new Menu();
+ subset_menu->additem(MN_LABEL,_("Load Subset"),0,0);
+ subset_menu->additem(MN_HL,"",0,0);
+ int i = 0;
+ for(std::set<std::string>::iterator it = level_subsets.begin(); it != level_subsets.end(); ++it, ++i)
+ subset_menu->additem(MN_ACTION, (*it),0,0,i);
+ subset_menu->additem(MN_HL,"",0,0);
+ subset_menu->additem(MN_BACK,_("Back"),0,0);
+
+ create_subset_menu = new Menu();
+ create_subset_menu->additem(MN_LABEL,_("New Level Subset"),0,0);
+ create_subset_menu->additem(MN_HL,"",0,0);
+ create_subset_menu->additem(MN_TEXTFIELD,_("Filename "),0,0,MN_ID_FILENAME_SUBSET);
+ create_subset_menu->additem(MN_TEXTFIELD,_("Title "),0,0,MN_ID_TITLE_SUBSET);
+ create_subset_menu->additem(MN_TEXTFIELD,_("Description"),0,0,MN_ID_DESCRIPTION_SUBSET);
+ create_subset_menu->additem(MN_ACTION,_("Create"),0,0, MN_ID_CREATE_SUBSET);
+ create_subset_menu->additem(MN_HL,"",0,0);
+ create_subset_menu->additem(MN_BACK,_("Back"),0,0);
+
+ main_menu = new Menu();
+ main_menu->additem(MN_LABEL,_("Level Editor Menu"),0,0);
+ main_menu->additem(MN_HL,"",0,0);
+ main_menu->additem(MN_ACTION,_("Return to Level Editor"),0,0,MN_ID_RETURN);
+ main_menu->additem(MN_GOTO,_("Create Level Subset"),0,create_subset_menu);
+ main_menu->additem(MN_GOTO,_("Load Level Subset"),0,subset_menu);
+ main_menu->additem(MN_HL,"",0,0);
+ main_menu->additem(MN_ACTION,_("Quit Level Editor"),0,0,MN_ID_QUIT);
+
+ settings_menu = new Menu();
+ settings_menu->additem(MN_LABEL,_("Level Settings"),0,0);
+ settings_menu->additem(MN_HL,"",0,0);
+ settings_menu->additem(MN_TEXTFIELD,_("Name "),0,0,MN_ID_NAME);
+ settings_menu->additem(MN_TEXTFIELD,_("Author "),0,0,MN_ID_AUTHOR);
+ settings_menu->additem(MN_NUMFIELD, _("Width "),0,0,MN_ID_WIDTH);
+ settings_menu->additem(MN_NUMFIELD, _("Height "),0,0,MN_ID_HEIGHT);
+ settings_menu->additem(MN_HL,"",0,0);
+ settings_menu->additem(MN_ACTION,_("Apply"),0,0,MN_ID_APPLY_SETTINGS);
+
+ /* Creating button groups */
+ load_buttons_gfx();
+
+ tiles_board = new ButtonGroup(Vector(SCREEN_WIDTH - 140, 100),
+ Vector(32,32), Vector(4,8));
+
+ tiles_board->add_button(Button(img_rubber_bt, _("Eraser"), SDLKey(SDLK_DELETE)), 0);
+ unsigned int id;
+ for(id = 1; id < tile_manager->get_max_tileid(); id++)
+ {
+ const Tile* tile = tile_manager->get(id);
+ if(!tile)
+ continue;
+
+ Surface* surface = tile->get_editor_image();
+ if(!surface)
+ continue;
+
+ Button button = Button(surface, "", SDLKey(0));
+ tiles_board->add_button(button, id);
+ }
+ gameobjs_first_id = id;
+
+ for(Factories::iterator i = object_factories->begin();
+ i != object_factories->end(); ++i) {
+
+// Surface *img = badguy.get_image();
+// FIXME: get image from object. Using the rubber in the meanwhile.
+ tiles_board->add_button(Button(img_rubber_bt, i->first,
+ SDLKey(SDLK_1+id)), id++);
+ }
+
+ tiles_layer = new ButtonGroup(Vector(12, SCREEN_HEIGHT-64), Vector(80,20), Vector(1,3));
+ tiles_layer->add_button(Button(img_foreground_bt, _("Edtit foreground tiles"),
+ SDLK_F10), LAYER_FOREGROUNDTILES);
+ tiles_layer->add_button(Button(img_interactive_bt, _("Edit interactive tiles"),
+ SDLK_F11), LAYER_TILES, true);
+ tiles_layer->add_button(Button(img_background_bt, _("Edit background tiles"),
+ SDLK_F12), LAYER_BACKGROUNDTILES);
+
+ level_options = new ButtonGroup(Vector(SCREEN_WIDTH-164, SCREEN_HEIGHT-36), Vector(32,32), Vector(5,1));
+ level_options->add_pair_of_buttons(Button(img_next_sector_bt, _("Next sector"), SDLKey(0)), BT_NEXT_SECTOR,
+ Button(img_previous_sector_bt, _("Prevous sector"), SDLKey(0)), BT_PREVIOUS_SECTOR);
+ level_options->add_pair_of_buttons(Button(img_next_level_bt, _("Next level"), SDLKey(0)), BT_NEXT_LEVEL,
+ Button(img_previous_level_bt, _("Prevous level"), SDLKey(0)), BT_PREVIOUS_LEVEL);
+ level_options->add_button(Button(img_save_level_bt, _("Save level"), SDLK_F5), BT_LEVEL_SAVE);
+ level_options->add_button(Button(img_test_level_bt, _("Test level"), SDLK_F6), BT_LEVEL_TEST);
+ level_options->add_button(Button(img_setup_level_bt, _("Setup level"), SDLK_F7), BT_LEVEL_SETUP);
+}
+
+LevelEditor::~LevelEditor()