- TileOrObject() : tile(0), obj(NULL) { is_tile = true; };
-
- void Tile(unsigned int set_to) { tile = set_to; is_tile = true; }
- void Object(GameObject* pobj) { obj = pobj; is_tile = false; }
- //Returns true for a tile
- bool IsTile() { return is_tile; };
- //Returns true for a GameObject
- bool IsObject() { return !is_tile; };
-
-
- void Init() { tile = 0; obj = NULL; is_tile = true; };
-
- bool is_tile; //true for tile (false for object)
- unsigned int tile;
- GameObject* obj;
-};
-
-/* leveleditor internals */
-static string_list_type level_subsets;
-static bool le_level_changed; /* if changes, ask for saving, when quiting*/
-static bool show_minimap;
-static bool show_selections;
-static bool le_help_shown;
-static int pos_x, pos_y, cursor_x, cursor_y;
-static int le_level;
-static World* le_world;
-static LevelSubset* le_level_subset;
-static int le_show_grid;
-static int le_frame;
-static Surface* le_selection;
-static int done;
-static TileOrObject le_current;
-static bool le_mouse_pressed[2];
-static bool le_mouse_clicked[2];
-static Button* le_save_level_bt;
-static Button* le_exit_bt;
-static Button* le_test_level_bt;
-static Button* le_next_level_bt;
-static Button* le_previous_level_bt;
-static Button* le_move_right_bt;
-static Button* le_move_left_bt;
-static Button* le_move_up_bt;
-static Button* le_move_down_bt;
-static Button* le_rubber_bt;
-static Button* le_select_mode_one_bt;
-static Button* le_select_mode_two_bt;
-static Button* le_settings_bt;
-static Button* le_tilegroup_bt;
-static Button* le_objects_bt;
-static Button* le_object_select_bt;
-static Button* le_object_properties_bt;
-static ButtonPanel* le_tilemap_panel;
-static Menu* leveleditor_menu;
-static Menu* subset_load_menu;
-static Menu* subset_new_menu;
-static Menu* subset_settings_menu;
-static Menu* level_settings_menu;
-static Menu* select_tilegroup_menu;
-static Menu* select_objects_menu;
-static Timer select_tilegroup_menu_effect;
-static Timer select_objects_menu_effect;
-static Timer display_level_info;
-typedef std::map<std::string, ButtonPanel*> ButtonPanelMap;
-static ButtonPanelMap tilegroups_map;
-static ButtonPanelMap objects_map;
-static std::string cur_tilegroup;
-static std::string cur_objects;
-static MouseCursor* mouse_select_object;
-static MovingObject* selected_game_object;
-
-static square selection;
-static SelectionMode le_selection_mode;
-static SDL_Event event;
-TileMapType active_tm;
-
-int leveleditor(char* filename)
+ 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->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++)
+ {
+ const Tile* tile = tilemanager->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
+ continue;
+
+ Button button = Button(surface, "", SDLKey(0));
+ tiles_board->add_button(button, id);
+ }
+
+ #if 0
+ for(int i = 0; i < NUM_BadGuyKinds; i++)
+ {
+ // filter bomb, since it is only for internal use, not for levels
+ if(i == BAD_BOMB)
+ continue;
+
+ BadGuyKind kind = BadGuyKind(i);
+ BadGuy badguy(kind, 0,0);
+ badguy.activate(LEFT);
+
+ Surface *img = badguy.get_image();
+ tiles_board->add_button(Button(img, "", SDLKey(SDLK_1+i)), -(i+1));
+ }
+ #endif
+
+ #if 0
+ tiles_board->add_button(Button(img_trampoline[0].get_frame(0), _("Trampoline"), SDLKey(0)), OBJ_TRAMPOLINE);
+ tiles_board->add_button(Button(img_flying_platform->get_frame(0), _("Flying Platform"), SDLKey(0)), OBJ_FLYING_PLATFORM);
+ #endif
+
+ tiles_layer = new ButtonGroup(Vector(12, screen->h-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->w-164, screen->h-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()