more kinds of menu_event are handled directly in the menu-code now.
[supertux.git] / src / leveleditor.cpp
index 3cc6cc7..4889c17 100644 (file)
@@ -66,7 +66,7 @@ void le_quit();
 void le_drawlevel();
 void le_drawinterface();
 void le_checkevents();
-void le_change(float x, float y, unsigned char c);
+void le_change(float x, float y, int tm, unsigned int c);
 void le_testlevel();
 void le_showhelp();
 void le_set_defaults(void);
@@ -90,7 +90,7 @@ static int le_show_grid;
 static int le_frame;
 static texture_type le_selection;
 static int done;
-static char le_current_tile;
+static unsigned int le_current_tile;
 static bool le_mouse_pressed[2];
 static button_type le_save_level_bt;
 static button_type le_test_level_bt;
@@ -108,31 +108,16 @@ static button_type le_fgd_bt;
 static button_panel_type le_bkgd_panel;
 static button_panel_type le_fgd_panel;
 static button_panel_type le_bad_panel;
-static menu_type leveleditor_menu;
-static menu_type subset_load_menu;
-static menu_type subset_new_menu;
-static menu_type subset_settings_menu;
-static menu_type level_settings_menu;
+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 square selection;
 static int le_selection_mode;
 static SDL_Event event;
 
-void le_activate_bad_guys(void)
-{
-  int x,y;
-
-  /* Activate bad guys: */
-
-  /* as oposed to the gameloop.c func, this one doesn't remove
-  the badguys from tiles                                    */
-
-  for (y = 0; y < 15; ++y)
-    for (x = 0; x < le_current_level->width; ++x)
-      if (le_current_level->tiles[y][x] >= '0' && le_current_level->tiles[y][x] <= '9')
-        add_bad_guy(x * 32, y * 32, le_current_level->tiles[y][x] - '0');
-}
-
 void le_set_defaults()
 {
   if(le_current_level != NULL)
@@ -187,9 +172,9 @@ int leveleditor(int levelnb)
       if(show_menu)
         {
           menu_process_current();
-          if(current_menu == &leveleditor_menu)
+          if(current_menu == leveleditor_menu)
             {
-              switch (menu_check(&leveleditor_menu))
+              switch (leveleditor_menu->check())
                 {
                 case 2:
                   show_menu = false;
@@ -202,22 +187,22 @@ int leveleditor(int levelnb)
                   break;
                 }
             }
-          else if(current_menu == &level_settings_menu)
+          else if(current_menu == level_settings_menu)
             {
-              switch (menu_check(&level_settings_menu))
+              switch (level_settings_menu->check())
                 {
                 case 13:
                   apply_level_settings_menu();
-                  menu_set_current(&leveleditor_menu);
+                  Menu::set_current(leveleditor_menu);
                   break;
                 default:
                   show_menu = true;
                   break;
                 }
             }
-          else if(current_menu == &subset_load_menu)
+          else if(current_menu == subset_load_menu)
             {
-              switch (i = menu_check(&subset_load_menu))
+              switch (i = subset_load_menu->check())
                 {
                 case 0:
                   break;
@@ -225,7 +210,7 @@ int leveleditor(int levelnb)
                   if(i != -1)
                     {
                       le_level_subset.load(level_subsets.item[i-2]);
-                      leveleditor_menu.item[3].kind = MN_GOTO;
+                      leveleditor_menu->item[3].kind = MN_GOTO;
                       le_level = 1;
                       arrays_init();
                       loadshared();
@@ -238,26 +223,25 @@ int leveleditor(int levelnb)
                      le_update_buttons(le_current_level->theme.c_str());
                       le_set_defaults();
                       level_load_gfx(le_current_level);
-                      le_activate_bad_guys();
                       show_menu = true;
                     }
                   break;
                 }
             }
-          else if(current_menu == &subset_new_menu)
+          else if(current_menu == subset_new_menu)
             {
-              if(subset_new_menu.item[2].input[0] == '\0')
-                subset_new_menu.item[3].kind = MN_DEACTIVE;
+              if(subset_new_menu->item[2].input[0] == '\0')
+                subset_new_menu->item[3].kind = MN_DEACTIVE;
               else
                 {
-                  subset_new_menu.item[3].kind = MN_ACTION;
+                  subset_new_menu->item[3].kind = MN_ACTION;
 
-                  switch (i = menu_check(&subset_new_menu))
+                  switch (i = subset_new_menu->check())
                     {
                     case 3:
-                     st_subset::create(subset_new_menu.item[2].input);
-                      le_level_subset.load(subset_new_menu.item[2].input);
-                      leveleditor_menu.item[3].kind = MN_GOTO;
+                     st_subset::create(subset_new_menu->item[2].input);
+                      le_level_subset.load(subset_new_menu->item[2].input);
+                      leveleditor_menu->item[3].kind = MN_GOTO;
                       le_level = 1;
                       arrays_init();
                       loadshared();
@@ -270,21 +254,20 @@ int leveleditor(int levelnb)
                      le_update_buttons(le_current_level->theme.c_str());
                       le_set_defaults();
                       level_load_gfx(le_current_level);
-                      le_activate_bad_guys();
-                      menu_item_change_input(&subset_new_menu.item[2],"");
+                      menu_item_change_input(&subset_new_menu->item[2],"");
                       show_menu = true;
                       break;
                     }
                 }
             }
-          else if(current_menu == &subset_settings_menu)
+          else if(current_menu == subset_settings_menu)
             {
-              if(le_level_subset.title.compare(subset_settings_menu.item[2].input) == 0 && le_level_subset.description.compare(subset_settings_menu.item[3].input) == 0  )
-                subset_settings_menu.item[5].kind = MN_DEACTIVE;
+              if(le_level_subset.title.compare(subset_settings_menu->item[2].input) == 0 && le_level_subset.description.compare(subset_settings_menu->item[3].input) == 0  )
+                subset_settings_menu->item[5].kind = MN_DEACTIVE;
               else
-                subset_settings_menu.item[5].kind = MN_ACTION;
+                subset_settings_menu->item[5].kind = MN_ACTION;
 
-              switch (i = menu_check(&subset_settings_menu))
+              switch (i = subset_settings_menu->check())
                 {
                 case 5:
                   save_subset_settings_menu();
@@ -379,7 +362,7 @@ int le_init()
   le_level_changed = false;
   le_current_level = NULL;
 
-  le_current_tile = '.';
+  le_current_tile = 0;
   le_mouse_pressed[LEFT] = false;
   le_mouse_pressed[RIGHT] = false;
 
@@ -488,64 +471,66 @@ int le_init()
       button_panel_additem(&le_bad_panel,button_create(filename, "Bad Guy",(SDLKey)((int)key+i),0,0),i);
     }
 
-  menu_init(&leveleditor_menu);
-  menu_additem(&leveleditor_menu, MN_LABEL,"Level Editor Menu",0,0);
-  menu_additem(&leveleditor_menu, MN_HL,"",0,0);
-  menu_additem(&leveleditor_menu, MN_ACTION,"Return To Level Editor",0,0);
-  menu_additem(&leveleditor_menu, MN_DEACTIVE,"Level Subset Settings",0,&subset_settings_menu);
-  menu_additem(&leveleditor_menu, MN_GOTO,"Load Level Subset",0,&subset_load_menu);
-  menu_additem(&leveleditor_menu, MN_GOTO,"New Level Subset",0,&subset_new_menu);
-  menu_additem(&leveleditor_menu, MN_HL,"",0,0);
-  menu_additem(&leveleditor_menu, MN_ACTION,"Quit Level Editor",0,0);
+  leveleditor_menu = new Menu();
+  subset_load_menu = new Menu();
+  subset_new_menu  = new Menu();
+  subset_settings_menu = new Menu();
+  level_settings_menu  = new Menu();
+
+  leveleditor_menu->additem(MN_LABEL,"Level Editor Menu",0,0);
+  leveleditor_menu->additem(MN_HL,"",0,0);
+  leveleditor_menu->additem(MN_ACTION,"Return To Level Editor",0,0);
+  leveleditor_menu->additem(MN_DEACTIVE,"Level Subset Settings",0,subset_settings_menu);
+  leveleditor_menu->additem(MN_GOTO,"Load Level Subset",0,subset_load_menu);
+  leveleditor_menu->additem(MN_GOTO,"New Level Subset",0,subset_new_menu);
+  leveleditor_menu->additem(MN_HL,"",0,0);
+  leveleditor_menu->additem(MN_ACTION,"Quit Level Editor",0,0);
 
   menu_reset();
-  menu_set_current(&leveleditor_menu);
+  Menu::set_current(leveleditor_menu);
   show_menu = true;
 
-  menu_init(&subset_load_menu);
-  menu_additem(&subset_load_menu,MN_LABEL,"Load Level Subset",0,0);
-  menu_additem(&subset_load_menu,MN_HL,"",0,0);
+  subset_load_menu->additem(MN_LABEL, "Load Level Subset", 0, 0);
+  subset_load_menu->additem(MN_HL, "", 0, 0);
+
   for(i = 0; i < level_subsets.num_items; ++i)
     {
-      menu_additem(&subset_load_menu,MN_ACTION,level_subsets.item[i],0,0);
+      subset_load_menu->additem(MN_ACTION,level_subsets.item[i],0,0);
     }
-  menu_additem(&subset_load_menu,MN_HL,"",0,0);
-  menu_additem(&subset_load_menu,MN_BACK,"Back",0,0);
-
-  menu_init(&subset_new_menu);
-  menu_additem(&subset_new_menu,MN_LABEL,"New Level Subset",0,0);
-  menu_additem(&subset_new_menu,MN_HL,"",0,0);
-  menu_additem(&subset_new_menu,MN_TEXTFIELD,"Enter Name",0,0);
-  menu_additem(&subset_new_menu,MN_ACTION,"Create",0,0);
-  menu_additem(&subset_new_menu,MN_HL,"",0,0);
-  menu_additem(&subset_new_menu,MN_BACK,"Back",0,0);
-
-  menu_init(&subset_settings_menu);
-  menu_additem(&subset_settings_menu,MN_LABEL,"Level Subset Settings",0,0);
-  menu_additem(&subset_settings_menu,MN_HL,"",0,0);
-  menu_additem(&subset_settings_menu,MN_TEXTFIELD,"Title",0,0);
-  menu_additem(&subset_settings_menu,MN_TEXTFIELD,"Description",0,0);
-  menu_additem(&subset_settings_menu,MN_HL,"",0,0);
-  menu_additem(&subset_settings_menu,MN_ACTION,"Save Changes",0,0);
-  menu_additem(&subset_settings_menu,MN_HL,"",0,0);
-  menu_additem(&subset_settings_menu,MN_BACK,"Back",0,0);
-
-  menu_init(&level_settings_menu);
-  level_settings_menu.arrange_left = true;
-  menu_additem(&level_settings_menu,MN_LABEL,"Level Settings",0,0);
-  menu_additem(&level_settings_menu,MN_HL,"",0,0);
-  menu_additem(&level_settings_menu,MN_TEXTFIELD,"Name    ",0,0);
-  menu_additem(&level_settings_menu,MN_STRINGSELECT,"Theme   ",0,0);
-  menu_additem(&level_settings_menu,MN_STRINGSELECT,"Song    ",0,0);
-  menu_additem(&level_settings_menu,MN_STRINGSELECT,"Bg-Image",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Length ",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Time   ",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Gravity",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Red    ",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Green  ",0,0);
-  menu_additem(&level_settings_menu,MN_NUMFIELD,"Blue   ",0,0);
-  menu_additem(&level_settings_menu,MN_HL,"",0,0);
-  menu_additem(&level_settings_menu,MN_ACTION,"Apply Changes",0,0);
+  subset_load_menu->additem(MN_HL,"",0,0);
+  subset_load_menu->additem(MN_BACK,"Back",0,0);
+
+  subset_new_menu->additem(MN_LABEL,"New Level Subset",0,0);
+  subset_new_menu->additem(MN_HL,"",0,0);
+  subset_new_menu->additem(MN_TEXTFIELD,"Enter Name",0,0);
+  subset_new_menu->additem(MN_ACTION,"Create",0,0);
+  subset_new_menu->additem(MN_HL,"",0,0);
+  subset_new_menu->additem(MN_BACK,"Back",0,0);
+
+  subset_settings_menu->additem(MN_LABEL,"Level Subset Settings",0,0);
+  subset_settings_menu->additem(MN_HL,"",0,0);
+  subset_settings_menu->additem(MN_TEXTFIELD,"Title",0,0);
+  subset_settings_menu->additem(MN_TEXTFIELD,"Description",0,0);
+  subset_settings_menu->additem(MN_HL,"",0,0);
+  subset_settings_menu->additem(MN_ACTION,"Save Changes",0,0);
+  subset_settings_menu->additem(MN_HL,"",0,0);
+  subset_settings_menu->additem(MN_BACK,"Back",0,0);
+
+  level_settings_menu->arrange_left = true;
+  level_settings_menu->additem(MN_LABEL,"Level Settings",0,0);
+  level_settings_menu->additem(MN_HL,"",0,0);
+  level_settings_menu->additem(MN_TEXTFIELD,"Name    ",0,0);
+  level_settings_menu->additem(MN_STRINGSELECT,"Theme   ",0,0);
+  level_settings_menu->additem(MN_STRINGSELECT,"Song    ",0,0);
+  level_settings_menu->additem(MN_STRINGSELECT,"Bg-Image",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Length ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Time   ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Gravity",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Red    ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Green  ",0,0);
+  level_settings_menu->additem(MN_NUMFIELD,"Blue   ",0,0);
+  level_settings_menu->additem(MN_HL,"",0,0);
+  level_settings_menu->additem(MN_ACTION,"Apply Changes",0,0);
 
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
 
@@ -557,100 +542,79 @@ void update_level_settings_menu()
   char str[80];
   int i;
 
-  menu_item_change_input(&level_settings_menu.item[2], le_current_level->name.c_str());
+  menu_item_change_input(&level_settings_menu->item[2], le_current_level->name.c_str());
   sprintf(str,"%d",le_current_level->width);
 
-  string_list_copy(level_settings_menu.item[3].list, dsubdirs("images/themes", "solid0.png"));
-  string_list_copy(level_settings_menu.item[4].list, dfiles("music/",NULL, "-fast"));
-  string_list_copy(level_settings_menu.item[5].list, dfiles("images/background",NULL, NULL));
-  string_list_add_item(level_settings_menu.item[5].list,"");
-  if((i = string_list_find(level_settings_menu.item[3].list,le_current_level->theme.c_str())) != -1)
-    level_settings_menu.item[3].list->active_item = i;
-  if((i = string_list_find(level_settings_menu.item[4].list,le_current_level->song_title.c_str())) != -1)
-    level_settings_menu.item[4].list->active_item = i;
-  if((i = string_list_find(level_settings_menu.item[5].list,le_current_level->bkgd_image.c_str())) != -1)
-    level_settings_menu.item[5].list->active_item = i;
-
-  menu_item_change_input(&level_settings_menu.item[6], str);
+  string_list_copy(level_settings_menu->item[3].list, dsubdirs("images/themes", "solid0.png"));
+  string_list_copy(level_settings_menu->item[4].list, dfiles("music/",NULL, "-fast"));
+  string_list_copy(level_settings_menu->item[5].list, dfiles("images/background",NULL, NULL));
+  string_list_add_item(level_settings_menu->item[5].list,"");
+  if((i = string_list_find(level_settings_menu->item[3].list,le_current_level->theme.c_str())) != -1)
+    level_settings_menu->item[3].list->active_item = i;
+  if((i = string_list_find(level_settings_menu->item[4].list,le_current_level->song_title.c_str())) != -1)
+    level_settings_menu->item[4].list->active_item = i;
+  if((i = string_list_find(level_settings_menu->item[5].list,le_current_level->bkgd_image.c_str())) != -1)
+    level_settings_menu->item[5].list->active_item = i;
+
+  menu_item_change_input(&level_settings_menu->item[6], str);
   sprintf(str,"%d",le_current_level->time_left);
-  menu_item_change_input(&level_settings_menu.item[7], str);
+  menu_item_change_input(&level_settings_menu->item[7], str);
   sprintf(str,"%2.0f",le_current_level->gravity);
-  menu_item_change_input(&level_settings_menu.item[8], str);
+  menu_item_change_input(&level_settings_menu->item[8], str);
   sprintf(str,"%d",le_current_level->bkgd_red);
-  menu_item_change_input(&level_settings_menu.item[9], str);
+  menu_item_change_input(&level_settings_menu->item[9], str);
   sprintf(str,"%d",le_current_level->bkgd_green);
-  menu_item_change_input(&level_settings_menu.item[10], str);
+  menu_item_change_input(&level_settings_menu->item[10], str);
   sprintf(str,"%d",le_current_level->bkgd_blue);
-  menu_item_change_input(&level_settings_menu.item[11], str);
+  menu_item_change_input(&level_settings_menu->item[11], str);
 }
 
 void update_subset_settings_menu()
 {
-  menu_item_change_input(&subset_settings_menu.item[2], le_level_subset.title.c_str());
-  menu_item_change_input(&subset_settings_menu.item[3], le_level_subset.description.c_str());
+  menu_item_change_input(&subset_settings_menu->item[2], le_level_subset.title.c_str());
+  menu_item_change_input(&subset_settings_menu->item[3], le_level_subset.description.c_str());
 }
 
 void apply_level_settings_menu()
 {
-  int i,y,j;
+  int i;
   i = false;
 
-  le_current_level->name = level_settings_menu.item[2].input;
+  le_current_level->name = level_settings_menu->item[2].input;
 
-  if(le_current_level->bkgd_image.compare(string_list_active(level_settings_menu.item[5].list)) != 0)
+  if(le_current_level->bkgd_image.compare(string_list_active(level_settings_menu->item[5].list)) != 0)
     {
-      le_current_level->bkgd_image = string_list_active(level_settings_menu.item[5].list);
+      le_current_level->bkgd_image = string_list_active(level_settings_menu->item[5].list);
       i = true;
     }
 
-  if(le_current_level->theme.compare(string_list_active(level_settings_menu.item[3].list)) != 0)
+  if(le_current_level->theme.compare(string_list_active(level_settings_menu->item[3].list)) != 0)
     {
-      le_current_level->theme = string_list_active(level_settings_menu.item[3].list);
+      le_current_level->theme = string_list_active(level_settings_menu->item[3].list);
       le_update_buttons(le_current_level->theme.c_str());
       i = true;
     }
 
-  if(i == true)
+  if(i)
     {
       level_free_gfx();
       level_load_gfx(le_current_level);
     }
 
-  le_current_level->song_title = string_list_active(level_settings_menu.item[4].list);
+  le_current_level->song_title = string_list_active(level_settings_menu->item[4].list);
 
-  i = le_current_level->width;
-  le_current_level->width = atoi(level_settings_menu.item[6].input);
-  if(le_current_level->width < i)
-    {
-      if(le_current_level->width < 21)
-        le_current_level->width = 21;
-      for(y = 0; y < 15; ++y)
-        {
-          le_current_level->tiles[y] = (unsigned int*) realloc(le_current_level->tiles[y],(le_current_level->width+1)*sizeof(unsigned int));
-          le_current_level->tiles[y][le_current_level->width] = (unsigned int) '\0';
-        }
-    }
-  else if(le_current_level->width > i)
-    {
-      for(y = 0; y < 15; ++y)
-        {
-          le_current_level->tiles[y] = (unsigned int*) realloc(le_current_level->tiles[y],(le_current_level->width+1)*sizeof(unsigned int));
-          for(j = 0; j < le_current_level->width - i; ++j)
-            le_current_level->tiles[y][i+j] = (unsigned int) '.';
-          le_current_level->tiles[y][le_current_level->width] = (unsigned int) '\0';
-        }
-    }
-  le_current_level->time_left = atoi(level_settings_menu.item[7].input);
-  le_current_level->gravity = atof(level_settings_menu.item[8].input);
-  le_current_level->bkgd_red = atoi(level_settings_menu.item[9].input);
-  le_current_level->bkgd_green = atoi(level_settings_menu.item[10].input);
-  le_current_level->bkgd_blue = atoi(level_settings_menu.item[11].input);
+  level_change_size(le_current_level, atoi(level_settings_menu->item[6].input));
+  le_current_level->time_left = atoi(level_settings_menu->item[7].input);
+  le_current_level->gravity = atof(level_settings_menu->item[8].input);
+  le_current_level->bkgd_red = atoi(level_settings_menu->item[9].input);
+  le_current_level->bkgd_green = atoi(level_settings_menu->item[10].input);
+  le_current_level->bkgd_blue = atoi(level_settings_menu->item[11].input);
 }
 
 void save_subset_settings_menu()
 {
-  le_level_subset.title = subset_settings_menu.item[2].input;
-  le_level_subset.description = subset_settings_menu.item[3].input;
+  le_level_subset.title = subset_settings_menu->item[2].input;
+  le_level_subset.description = subset_settings_menu->item[3].input;
   le_level_subset.save();
 }
 
@@ -675,8 +639,6 @@ void le_goto_level(int levelnb)
 
   level_free_gfx();
   level_load_gfx(le_current_level);
-
-  le_activate_bad_guys();
 }
 
 void le_quit(void)
@@ -688,11 +650,11 @@ void le_quit(void)
   SDL_EnableKeyRepeat(0, 0);    // disables key repeating
 
   texture_free(&le_selection);
-  menu_free(&leveleditor_menu);
-  menu_free(&subset_load_menu);
-  menu_free(&subset_new_menu);
-  menu_free(&subset_settings_menu);
-  menu_free(&level_settings_menu);
+  delete leveleditor_menu;
+  delete subset_load_menu;
+  delete subset_new_menu;
+  delete subset_settings_menu;
+  delete level_settings_menu;
   button_panel_free(&le_bkgd_panel);
   button_panel_free(&le_fgd_panel);
   button_panel_free(&le_bad_panel);
@@ -836,11 +798,11 @@ void le_drawlevel()
   for (y = 0; y < 15; ++y)
     for (x = 0; x < 20; ++x)
       {
-        drawshape(x * 32 - ((int)pos_x % 32), y * 32, le_current_level->tiles[y][x + (int)(pos_x / 32)]);
+        drawshape(x * 32 - ((int)pos_x % 32), y * 32, le_current_level->ia_tiles[y][x + (int)(pos_x / 32)]);
 
         /* draw whats inside stuff when cursor is selecting those */
         /* (draw them all the time - is this the right behaviour?) */
-        switch(le_current_level->tiles[y][x + (int)(pos_x/32)])
+        switch(le_current_level->ia_tiles[y][x + (int)(pos_x/32)])
           {
           case 'B':
             texture_draw(&img_mints, x * 32 - ((int)pos_x % 32), y*32);
@@ -851,7 +813,7 @@ void le_drawlevel()
           case 'x':
           case 'y':
           case 'A':
-            texture_draw(&img_distro[(frame / 5) % 4], x * 32 - ((int)pos_x % 32), y*32);
+            texture_draw(&img_distro[(global_frame_counter / 5) % 4], x * 32 - ((int)pos_x % 32), y*32);
             break;
           default:
             break;
@@ -873,7 +835,7 @@ void le_drawlevel()
 
   /* Draw the player: */
   /* for now, the position is fixed at (0, 240) */
-  texture_draw(&tux_right[(frame / 5) % 3], 0 - pos_x, 240);
+  texture_draw(&tux_right[(global_frame_counter / 5) % 3], 0 - pos_x, 240);
 }
 
 void le_checkevents()
@@ -898,11 +860,11 @@ void le_checkevents()
               key = event.key.keysym.sym;
               if(show_menu)
                 {
-                  menu_event(&event.key.keysym);
+                  menu_event(event);
                   if(key == SDLK_ESCAPE)
                     {
                       show_menu = false;
-                      menu_set_current(&leveleditor_menu);
+                      Menu::set_current(leveleditor_menu);
                     }
                   break;
                 }
@@ -1011,13 +973,13 @@ void le_checkevents()
                   cursor_x = ((int)(pos_x + x) / 32) * 32;
                   cursor_y = ((int) y / 32) * 32;
 
-                  if(le_mouse_pressed[LEFT] == true)
+                  if(le_mouse_pressed[LEFT])
                     {
                       selection.x2 = x + pos_x;
                       selection.y2 = y;
                     }
 
-                  if(le_mouse_pressed[RIGHT] == true)
+                  if(le_mouse_pressed[RIGHT])
                     {
                       pos_x += -1 * event.motion.xrel;
                     }
@@ -1102,7 +1064,7 @@ void le_checkevents()
                     }
                   button_event(&le_rubber_bt,&event);
                   if(button_get_state(&le_rubber_bt) == BUTTON_CLICKED)
-                    le_current_tile = '.';
+                    le_current_tile = 0;
                   button_event(&le_select_mode_one_bt,&event);
                   if(button_get_state(&le_select_mode_one_bt) == BUTTON_CLICKED)
                     le_selection_mode = CURSOR;
@@ -1138,12 +1100,12 @@ void le_checkevents()
                       if(show_menu == false)
                         {
                           update_level_settings_menu();
-                          menu_set_current(&level_settings_menu);
+                          Menu::set_current(level_settings_menu);
                           show_menu = true;
                         }
                       else
                         {
-                          menu_set_current(&leveleditor_menu);
+                          Menu::set_current(leveleditor_menu);
                           show_menu = false;
                         }
                     }
@@ -1229,12 +1191,12 @@ void le_checkevents()
                       if(show_menu == false)
                         {
                           update_level_settings_menu();
-                          menu_set_current(&level_settings_menu);
+                          Menu::set_current(level_settings_menu);
                           show_menu = true;
                         }
                       else
                         {
-                          menu_set_current(&leveleditor_menu);
+                          Menu::set_current(leveleditor_menu);
                           show_menu = false;
                         }
                     }
@@ -1247,7 +1209,7 @@ void le_checkevents()
 
               if(le_mouse_pressed[LEFT])
                 {
-                  le_change(cursor_x, cursor_y, le_current_tile);
+                  le_change(cursor_x, cursor_y, TM_IA, le_current_tile);
                 }
             }
         }
@@ -1308,7 +1270,7 @@ void le_highlight_selection()
   fillrect(x1*32-pos_x, y1*32,32* (x2 - x1 + 1),32 * (y2 - y1 + 1),173,234,177,103);
 }
 
-void le_change(float x, float y, unsigned char c)
+void le_change(float x, float y, int tm, unsigned int c)
 {
   if(le_current_level != NULL)
     {
@@ -1321,7 +1283,7 @@ void le_change(float x, float y, unsigned char c)
       switch(le_selection_mode)
         {
         case CURSOR:
-          level_change(le_current_level,x,y,c);
+          level_change(le_current_level,x,y,tm,c);
 
           yy = ((int)y / 32);
           xx = ((int)x / 32);
@@ -1329,7 +1291,7 @@ void le_change(float x, float y, unsigned char c)
           /* if there is a bad guy over there, remove it */
           for(i = 0; i < bad_guys.size(); ++i)
               if(xx == bad_guys[i].base.x/32 && yy == bad_guys[i].base.y/32)
-                  bad_guys.erase(static_cast<std::vector<bad_guy_type>::iterator>(&bad_guys[i]));
+                  bad_guys.erase(static_cast<std::vector<BadGuy>::iterator>(&bad_guys[i]));
 
           if(c == '0')  /* if it's a bad guy */
             add_bad_guy(xx*32, yy*32, BAD_BSOD);
@@ -1370,12 +1332,12 @@ void le_change(float x, float y, unsigned char c)
           for(i = 0; i < bad_guys.size(); ++i)
               if(bad_guys[i].base.x/32 >= x1 && bad_guys[i].base.x/32 <= x2
                   && bad_guys[i].base.y/32 >= y1 && bad_guys[i].base.y/32 <= y2)
-                  bad_guys.erase(static_cast<std::vector<bad_guy_type>::iterator>(&bad_guys[i]));
+                  bad_guys.erase(static_cast<std::vector<BadGuy>::iterator>(&bad_guys[i]));
 
           for(xx = x1; xx <= x2; xx++)
             for(yy = y1; yy <= y2; yy++)
               {
-                level_change(le_current_level, xx*32, yy*32, c);
+                level_change(le_current_level, xx*32, yy*32, tm, c);
 
                 if(c == '0')  // if it's a bad guy
                   add_bad_guy(xx*32, yy*32, BAD_BSOD);
@@ -1395,11 +1357,10 @@ void le_testlevel()
 {
   level_save(le_current_level,"test",le_level);
   gameloop("test",le_level, ST_GL_TEST);
-  menu_set_current(&leveleditor_menu);
+  Menu::set_current(leveleditor_menu);
   arrays_init();
   level_load_gfx(le_current_level);
   loadshared();
-  le_activate_bad_guys();
 }
 
 void le_showhelp()