- memleak fix and menu fix from MatzeB
[supertux.git] / src / title.cpp
index 0dfe8d6..96dca72 100644 (file)
@@ -58,11 +58,11 @@ static Surface* img_choose_subset;
 static bool walking;
 static Timer random_timer;
 
-static int frame, i;
+static int frame;
 static unsigned int last_update_time;
 static unsigned int update_time;
 
-void display_credits();
+void display_text_file(char *filename);
 
 std::vector<st_subset> contrib_subsets;
 std::string current_contrib_subset;
@@ -79,7 +79,8 @@ void generate_contrib_menu()
     {
       st_subset subset;
       subset.load(level_subsets.item[i]);
-      contrib_menu->additem(MN_GOTO, subset.title.c_str(), i, contrib_subset_menu);
+      contrib_menu->additem(MN_GOTO, subset.title.c_str(), i,
+          contrib_subset_menu, i+1);
       contrib_subsets.push_back(subset);
     }
 
@@ -96,7 +97,7 @@ void check_contrib_menu()
   int index = contrib_menu->check();
   if (index != -1)
     {
-      index -= 2; // FIXME: Hack
+      index -= 1;
       if (index >= 0 && index <= int(contrib_subsets.size()))
         {
           if (current_subset != index)
@@ -117,7 +118,7 @@ void check_contrib_menu()
                 {
                   Level level;
                   level.load(subset.name, i);
-                  contrib_subset_menu->additem(MN_ACTION, level.name, 0, 0);
+                  contrib_subset_menu->additem(MN_ACTION, level.name, 0, 0, i);
                 }
               contrib_subset_menu->additem(MN_HL,"",0,0);      
               contrib_subset_menu->additem(MN_BACK, "Back", 0, 0);
@@ -135,9 +136,8 @@ void check_contrib_subset_menu()
   int index = contrib_subset_menu->check();
   if (index != -1)
     {
-      if (contrib_subset_menu->get_item(index).kind == MN_ACTION)
+      if (contrib_subset_menu->get_item_by_id(index).kind == MN_ACTION)
         {
-          index -= 1; // FIXME: Hack
           std::cout << "Sarting level: " << index << std::endl;
           GameSession session(current_contrib_subset, index, ST_GL_PLAY);
           session.run();
@@ -159,6 +159,8 @@ void draw_demo(GameSession* session, double frame_ratio)
   //World* world  = session->get_world();
   Level* plevel = session->get_level();
   Player* tux = session->get_world()->get_tux();
+
+  session->get_world()->play_music(LEVEL_MUSIC);
   
   /* FIXME:
   // update particle systems
@@ -186,14 +188,14 @@ void draw_demo(GameSession* session, double frame_ratio)
     }
 
   global_frame_counter++;
-  tux->key_event(SDLK_RIGHT,DOWN);
+  tux->key_event((SDLKey) keymap.right,DOWN);
   
   if(random_timer.check())
     {
       if(walking)
-        tux->key_event(SDLK_UP,UP);
+        tux->key_event((SDLKey) keymap.jump,UP);
       else
-        tux->key_event(SDLK_UP,DOWN);
+        tux->key_event((SDLKey) keymap.jump,DOWN);
     }
   else
     {
@@ -265,12 +267,9 @@ void title(void)
             {
               Menu::current()->event(event);
             }
-          else
-            {
-              // FIXME: QUIT signal should be handled more generic, not locally
-              if (event.type == SDL_QUIT)
-                Menu::set_current(0);
-            }
+         // FIXME: QUIT signal should be handled more generic, not locally
+          if (event.type == SDL_QUIT)
+            Menu::set_current(0);
         }
 
       /* Draw the background: */
@@ -298,24 +297,24 @@ void title(void)
             {
               switch (main_menu->check())
                 {
-                case 0:
+                case MNID_STARTGAME:
                   // Start Game, ie. goto the slots menu
                   update_load_save_game_menu(load_game_menu);
                   break;
-                case 1:
+                case MNID_CONTRIB:
                   // Contrib Menu
                   puts("Entering contrib menu");
                   generate_contrib_menu();
                   break;
-                case 3:
+                case MNID_LEVELEDITOR:
                   leveleditor(1);
                   Menu::set_current(main_menu);
                   break;
-                case 4:
-                  display_credits();
+                case MNID_CREDITS:
+                  display_text_file("CREDITS");
                   Menu::set_current(main_menu);
                   break;
-                case 5:
+                case MNID_QUITMAINMENU:
                   Menu::set_current(0);
                   break;
                 }
@@ -356,7 +355,6 @@ void title(void)
       /* Pause: */
       frame++;
       SDL_Delay(25);
-
     }
   /* Free surfaces: */
 
@@ -367,20 +365,21 @@ void title(void)
 #define MAX_VEL 10
 #define SPEED   1
 #define SCROLL  60
+#define ITEMS_SPACE 4
 
-void display_credits()
+void display_text_file(char *file)
 {
   int done;
   int scroll, speed;
+  int y;
   Timer timer;
-  int n,d;
   int length;
   FILE* fi;
   char temp[1024];
   string_list_type names;
   char filename[1024];
   string_list_init(&names);
-  sprintf(filename,"%s/CREDITS", datadir.c_str());
+  sprintf(filename,"%s/%s", datadir.c_str(), file);
   if((fi = fopen(filename,"r")) != NULL)
     {
       while(fgets(temp, sizeof(temp), fi) != NULL)
@@ -406,8 +405,6 @@ void display_credits()
   speed = 2;
   done = 0;
 
-  n = d = 0;
-
   length = names.num_items;
 
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
@@ -456,28 +453,37 @@ void display_credits()
 
       draw_background();
 
-      white_big_text->drawf("- Credits -", 0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
+      if (strcmp(file, "CREDITS") == 0)
+        white_big_text->drawf("- SuperTux " VERSION " -", 
+                              0, screen->h-scroll, A_HMIDDLE, A_TOP, 2);
 
-      for(i = 0, n = 0, d = 0; i < length; i++,n++,d++)
+      y = 0;
+      for(int i = 0; i < length; i++)
         {
-          if(names.item[i] == "")
-            n--;
-          else
-            {
-              if(names.item[i][0] == ' ')
-                white_small_text->drawf(names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll-10, A_HMIDDLE, A_TOP, 1);
-              else if(names.item[i][0] == '    ')
-                white_text->drawf(names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
-              else if(names.item[i+1][0] == '-' || names.item[i][0] == '-')
-                white_big_text->drawf(names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 3);
-              else
-                blue_text->drawf(names.item[i], 0, 60+screen->h+(n*18)+(d*18)-scroll, A_HMIDDLE, A_TOP, 1);
-            }
+        switch(names.item[i][0])
+          {
+          case ' ':
+            white_small_text->drawf(names.item[i], 0, 60+screen->h+y-scroll, A_HMIDDLE, A_TOP, 1);
+            y += white_small_text->h+ITEMS_SPACE;
+            break;
+          case '       ':
+            white_text->drawf(names.item[i], 0, 60+screen->h+y-scroll, A_HMIDDLE, A_TOP, 1);
+            y += white_text->h+ITEMS_SPACE;
+            break;
+          case '-':
+            white_big_text->drawf(names.item[i], 0, 60+screen->h+y-scroll, A_HMIDDLE, A_TOP, 3);
+            y += white_big_text->h+ITEMS_SPACE;
+            break;
+          default:
+            blue_text->drawf(names.item[i], 0, 60+screen->h+y-scroll, A_HMIDDLE, A_TOP, 1);
+            y += blue_text->h+ITEMS_SPACE;
+            break;
+          }
         }
 
       flipscreen();
 
-      if(60+screen->h+(n*18)+(d*18)-scroll < 0 && 20+60+screen->h+(n*18)+(d*18)-scroll < 0)
+      if(60+screen->h+y-scroll < 0 && 20+60+screen->h+y-scroll < 0)
         done = 1;
 
       scroll += speed;