- added read_string_vector
[supertux.git] / src / leveleditor.cpp
index a7c5b8b..c7776a3 100644 (file)
@@ -261,7 +261,7 @@ int leveleditor(int levelnb)
                       le_level = 1;
                       arrays_init();
                       loadshared();
-                      le_current_level = (st_level*) malloc(sizeof(st_level));
+                      le_current_level = new st_level;
                       if(level_load(le_current_level, le_level_subset.name.c_str(), le_level) != 0)
                         {
                           le_quit();
@@ -383,7 +383,7 @@ int le_init()
   le_mouse_pressed[LEFT] = NO;
   le_mouse_pressed[RIGHT] = NO;
 
-  texture_load(&le_selection,DATA_PREFIX "/images/leveleditor/select.png", USE_ALPHA);
+  texture_load(&le_selection, datadir + "/images/leveleditor/select.png", USE_ALPHA);
 
   /* Load buttons */
   button_load(&le_save_level_bt,"/images/icons/save.png","Save level", SDLK_F6,screen->w-64,32);
@@ -489,63 +489,63 @@ int le_init()
     }
 
   menu_init(&leveleditor_menu);
-  menu_additem(&leveleditor_menu,menu_item_create(MN_LABEL,"Level Editor Menu",0,0));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_ACTION,"Return To Level Editor",0,0));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_DEACTIVE,"Level Subset Settings",0,&subset_settings_menu));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_GOTO,"Load Level Subset",0,&subset_load_menu));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_GOTO,"New Level Subset",0,&subset_new_menu));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&leveleditor_menu,menu_item_create(MN_ACTION,"Quit Level Editor",0,0));
+  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);
 
   menu_reset();
   menu_set_current(&leveleditor_menu);
   show_menu = YES;
 
   menu_init(&subset_load_menu);
-  menu_additem(&subset_load_menu,menu_item_create(MN_LABEL,"Load Level Subset",0,0));
-  menu_additem(&subset_load_menu,menu_item_create(MN_HL,"",0,0));
+  menu_additem(&subset_load_menu,MN_LABEL,"Load Level Subset",0,0);
+  menu_additem(&subset_load_menu,MN_HL,"",0,0);
   for(i = 0; i < level_subsets.num_items; ++i)
     {
-      menu_additem(&subset_load_menu,menu_item_create(MN_ACTION,level_subsets.item[i],0,0));
+      menu_additem(&subset_load_menu,MN_ACTION,level_subsets.item[i],0,0);
     }
-  menu_additem(&subset_load_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_load_menu,menu_item_create(MN_BACK,"Back",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,menu_item_create(MN_LABEL,"New Level Subset",0,0));
-  menu_additem(&subset_new_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_new_menu,menu_item_create(MN_TEXTFIELD,"Enter Name",0,0));
-  menu_additem(&subset_new_menu,menu_item_create(MN_ACTION,"Create",0,0));
-  menu_additem(&subset_new_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_new_menu,menu_item_create(MN_BACK,"Back",0,0));
+  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,menu_item_create(MN_LABEL,"Level Subset Settings",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_TEXTFIELD,"Title",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_TEXTFIELD,"Description",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_ACTION,"Save Changes",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&subset_settings_menu,menu_item_create(MN_BACK,"Back",0,0));
+  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 = YES;
-  menu_additem(&level_settings_menu,menu_item_create(MN_LABEL,"Level Settings",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_TEXTFIELD,"Name    ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_STRINGSELECT,"Theme   ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_STRINGSELECT,"Song    ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_STRINGSELECT,"Bg-Image",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Length ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Time   ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Gravity",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Red    ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Green  ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_NUMFIELD,"Blue   ",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_HL,"",0,0));
-  menu_additem(&level_settings_menu,menu_item_create(MN_ACTION,"Apply Changes",0,0));
+  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);
 
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
 
@@ -801,7 +801,7 @@ void le_drawinterface()
       button_panel_draw(&le_bad_panel);
 
       sprintf(str, "%d/%d", le_level,le_level_subset.levels);
-      text_drawf(&white_text, str, -8, 16, A_RIGHT, A_NONE, 1, NO_UPDATE);
+      text_drawf(&white_text, str, -8, 16, A_RIGHT, A_TOP, 1, NO_UPDATE);
 
       text_draw(&white_small_text, "F1 for Help", 10, 430, 1, NO_UPDATE);
     }
@@ -817,7 +817,7 @@ void le_drawinterface()
 
 void le_drawlevel()
 {
-  int y,x,i,s;
+  unsigned int y,x,i,s;
 
   /* Draw the real background */
   if(le_current_level->bkgd_image[0] != '\0')
@@ -859,10 +859,8 @@ void le_drawlevel()
       }
 
   /* Draw the Bad guys: */
-  for (i = 0; i < num_bad_guys; ++i)
+  for (i = 0; i < bad_guys.size(); ++i)
     {
-      if(bad_guys[i].base.alive == NO)
-        continue;
       /* to support frames: img_bsod_left[(frame / 5) % 4] */
       if(bad_guys[i].kind == BAD_BSOD)
         texture_draw(&img_bsod_left[(le_frame / 5) % 4], bad_guys[i].base.x - pos_x, bad_guys[i].base.y, NO_UPDATE);
@@ -1045,13 +1043,13 @@ void le_checkevents()
                 {
                   /* Check for button events */
                   button_event(&le_test_level_bt,&event);
-                  if(button_get_state(&le_test_level_bt) == BN_CLICKED)
+                  if(button_get_state(&le_test_level_bt) == BUTTON_CLICKED)
                     le_testlevel();
                   button_event(&le_save_level_bt,&event);
-                  if(button_get_state(&le_save_level_bt) == BN_CLICKED)
+                  if(button_get_state(&le_save_level_bt) == BUTTON_CLICKED)
                     level_save(le_current_level,le_level_subset.name.c_str(),le_level);
                   button_event(&le_next_level_bt,&event);
-                  if(button_get_state(&le_next_level_bt) == BN_CLICKED)
+                  if(button_get_state(&le_next_level_bt) == BUTTON_CLICKED)
                     {
                       if(le_level < le_level_subset.levels)
                         {
@@ -1097,23 +1095,23 @@ void le_checkevents()
                         }
                     }
                   button_event(&le_previous_level_bt,&event);
-                  if(button_get_state(&le_previous_level_bt) == BN_CLICKED)
+                  if(button_get_state(&le_previous_level_bt) == BUTTON_CLICKED)
                     {
                       if(le_level > 1)
                         le_goto_level(--le_level);
                     }
                   button_event(&le_rubber_bt,&event);
-                  if(button_get_state(&le_rubber_bt) == BN_CLICKED)
+                  if(button_get_state(&le_rubber_bt) == BUTTON_CLICKED)
                     le_current_tile = '.';
                   button_event(&le_select_mode_one_bt,&event);
-                  if(button_get_state(&le_select_mode_one_bt) == BN_CLICKED)
+                  if(button_get_state(&le_select_mode_one_bt) == BUTTON_CLICKED)
                     le_selection_mode = CURSOR;
                   button_event(&le_select_mode_two_bt,&event);
-                  if(button_get_state(&le_select_mode_two_bt) == BN_CLICKED)
+                  if(button_get_state(&le_select_mode_two_bt) == BUTTON_CLICKED)
                     le_selection_mode = SQUARE;
 
                   button_event(&le_bad_bt,&event);
-                  if(button_get_state(&le_bad_bt) == BN_CLICKED)
+                  if(button_get_state(&le_bad_bt) == BUTTON_CLICKED)
                     {
                       le_bad_panel.hidden = NO;
                       le_fgd_panel.hidden = YES;
@@ -1121,21 +1119,21 @@ void le_checkevents()
                     }
 
                   button_event(&le_fgd_bt,&event);
-                  if(button_get_state(&le_fgd_bt) == BN_CLICKED)
+                  if(button_get_state(&le_fgd_bt) == BUTTON_CLICKED)
                     {
                       le_bad_panel.hidden = YES;
                       le_fgd_panel.hidden = NO;
                       le_bkgd_panel.hidden = YES;
                     }
                   button_event(&le_bkgd_bt,&event);
-                  if(button_get_state(&le_bkgd_bt) == BN_CLICKED)
+                  if(button_get_state(&le_bkgd_bt) == BUTTON_CLICKED)
                     {
                       le_bad_panel.hidden = YES;
                       le_fgd_panel.hidden = YES;
                       le_bkgd_panel.hidden = NO;
                     }
                   button_event(&le_settings_bt,&event);
-                  if(button_get_state(&le_settings_bt) == BN_CLICKED)
+                  if(button_get_state(&le_settings_bt) == BUTTON_CLICKED)
                     {
                       if(show_menu == NO)
                         {
@@ -1151,7 +1149,7 @@ void le_checkevents()
                     }
                   if((pbutton = button_panel_event(&le_bkgd_panel,&event)) != NULL)
                     {
-                      if(button_get_state(pbutton) == BN_CLICKED)
+                      if(button_get_state(pbutton) == BUTTON_CLICKED)
                         {
                           char c = '\0';
                           if(pbutton->tag >= 0 && pbutton->tag <= 3)
@@ -1168,7 +1166,7 @@ void le_checkevents()
                     }
                   if((pbutton = button_panel_event(&le_fgd_panel,&event)) != NULL)
                     {
-                      if(button_get_state(pbutton) == BN_CLICKED)
+                      if(button_get_state(pbutton) == BUTTON_CLICKED)
                         {
                           char c = '\0';
                           if(pbutton->tag == 0)
@@ -1213,7 +1211,7 @@ void le_checkevents()
                     }
                   if((pbutton = button_panel_event(&le_bad_panel,&event)) != NULL)
                     {
-                      if(button_get_state(pbutton) == BN_CLICKED)
+                      if(button_get_state(pbutton) == BUTTON_CLICKED)
                         {
                           char c = '\0';
                           if(pbutton->tag >= 0 && pbutton->tag <= 2)
@@ -1226,7 +1224,7 @@ void le_checkevents()
               else
                 {
                   button_event(&le_settings_bt,&event);
-                  if(button_get_state(&le_settings_bt) == BN_CLICKED)
+                  if(button_get_state(&le_settings_bt) == BUTTON_CLICKED)
                     {
                       if(show_menu == NO)
                         {
@@ -1256,20 +1254,20 @@ void le_checkevents()
     }
   if(show_menu == NO)
     {
-      if(button_get_state(&le_move_left_bt) == BN_PRESSED)
+      if(button_get_state(&le_move_left_bt) == BUTTON_PRESSED)
         {
           pos_x -= 192;
         }
-      else if(button_get_state(&le_move_left_bt) == BN_HOVER)
+      else if(button_get_state(&le_move_left_bt) == BUTTON_HOVER)
         {
           pos_x -= 96;
         }
 
-      if(button_get_state(&le_move_right_bt) == BN_PRESSED)
+      if(button_get_state(&le_move_right_bt) == BUTTON_PRESSED)
         {
           pos_x += 192;
         }
-      else if(button_get_state(&le_move_right_bt) == BN_HOVER)
+      else if(button_get_state(&le_move_right_bt) == BUTTON_HOVER)
         {
           pos_x += 96;
         }
@@ -1314,8 +1312,9 @@ void le_change(float x, float y, unsigned char c)
 {
   if(le_current_level != NULL)
     {
-      int xx,yy,i;
+      int xx,yy;
       int x1, x2, y1, y2;
+      unsigned int i;
 
       /*  level_changed = YES; */
 
@@ -1328,10 +1327,9 @@ void le_change(float x, float y, unsigned char c)
           xx = ((int)x / 32);
 
           /* if there is a bad guy over there, remove it */
-          for(i = 0; i < num_bad_guys; ++i)
-            if (bad_guys[i].base.alive)
+          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[i].base.alive = NO;
+                  bad_guys.erase(static_cast<std::vector<bad_guy_type>::iterator>(&bad_guys[i]));
 
           if(c == '0')  /* if it's a bad guy */
             add_bad_guy(xx*32, yy*32, BAD_BSOD);
@@ -1369,11 +1367,10 @@ void le_change(float x, float y, unsigned char c)
           y2 /= 32;
 
           /* if there is a bad guy over there, remove it */
-          for(i = 0; i < num_bad_guys; ++i)
-            if(bad_guys[i].base.alive)
+          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[i].base.alive = NO;
+                  bad_guys.erase(static_cast<std::vector<bad_guy_type>::iterator>(&bad_guys[i]));
 
           for(xx = x1; xx <= x2; xx++)
             for(yy = y1; yy <= y2; yy++)