Limitated the number of bullets to be shot at the same time.
[supertux.git] / src / worldmap.cpp
index ebd052c..7e3f00c 100644 (file)
@@ -281,7 +281,7 @@ WorldMap::WorldMap()
   input_direction = NONE;
   enter_level = false;
 
-  name = "<no name>";
+  name = "<no file>";
   music = "SALCON.MOD";
   song = 0;
 
@@ -345,6 +345,9 @@ WorldMap::load_map()
                       reader.read_string("name",  &level.name);
                       reader.read_int("x", &level.x);
                       reader.read_int("y", &level.y);
+
+                      get_level_title(&level);   // get level's title
+
                       levels.push_back(level);
                     }
                   
@@ -361,6 +364,48 @@ WorldMap::load_map()
     }
 }
 
+void WorldMap::get_level_title(Levels::pointer level)
+{
+/** get level's title */
+level->title = "<no title>";
+
+FILE * fi;
+lisp_object_t* root_obj = 0;
+fi = fopen((datadir +  "levels/" + level->name).c_str(), "r");
+if (fi == NULL)
+  {
+  perror((datadir +  "levels/" + level->name).c_str());
+  return;
+  }
+
+lisp_stream_t stream;
+lisp_stream_init_file (&stream, fi);
+root_obj = lisp_read (&stream);
+
+if (root_obj->type == LISP_TYPE_EOF || root_obj->type == LISP_TYPE_PARSE_ERROR)
+  {
+  printf("World: Parse Error in file %s", level->name.c_str());
+  }
+
+if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-level") == 0)
+  {
+  LispReader reader(lisp_cdr(root_obj));
+  reader.read_string("name",  &level->title);
+  }
+
+fclose(fi);
+}
+
+void
+WorldMap::on_escape_press()
+{
+  // Show or hide the menu
+  if(!Menu::current())
+    Menu::set_current(worldmap_menu); 
+  else
+    Menu::set_current(0); 
+}
+
 void
 WorldMap::get_input()
 {
@@ -370,11 +415,11 @@ WorldMap::get_input()
   SDL_Event event;
   while (SDL_PollEvent(&event))
     {
-      if(!show_menu && event.key.keysym.sym == SDLK_ESCAPE)
-        Menu::set_current(worldmap_menu);
-
-      current_menu->event(event);
-      if(!show_menu)
+      if (Menu::current())
+        {
+          Menu::current()->event(event);
+        }
+      else
         {
           switch(event.type)
             {
@@ -385,6 +430,9 @@ WorldMap::get_input()
             case SDL_KEYDOWN:
               switch(event.key.keysym.sym)
                 {
+                case SDLK_ESCAPE:
+                  on_escape_press();
+                  break;
                 case SDLK_LCTRL:
                 case SDLK_RETURN:
                   enter_level = true;
@@ -395,26 +443,27 @@ WorldMap::get_input()
               break;
           
             case SDL_JOYAXISMOTION:
-              switch(event.jaxis.axis)
+              if (event.jaxis.axis == joystick_keymap.x_axis)
                 {
-                case JOY_X:
-                  if (event.jaxis.value < -JOYSTICK_DEAD_ZONE)
+                  if (event.jaxis.value < -joystick_keymap.dead_zone)
                     input_direction = WEST;
-                  else if (event.jaxis.value > JOYSTICK_DEAD_ZONE)
+                  else if (event.jaxis.value > joystick_keymap.dead_zone)
                     input_direction = EAST;
-                  break;
-                case JOY_Y:
-                  if (event.jaxis.value > JOYSTICK_DEAD_ZONE)
+                }
+              else if (event.jaxis.axis == joystick_keymap.y_axis)
+                {
+                  if (event.jaxis.value > joystick_keymap.dead_zone)
                     input_direction = SOUTH;
-                  else if (event.jaxis.value < -JOYSTICK_DEAD_ZONE)
+                  else if (event.jaxis.value < -joystick_keymap.dead_zone)
                     input_direction = NORTH;
-                  break;
                 }
               break;
 
             case SDL_JOYBUTTONDOWN:
-              if (event.jbutton.button == JOY_B)
+              if (event.jbutton.button == joystick_keymap.b_button)
                 enter_level = true;
+              else if (event.jbutton.button == joystick_keymap.start_button)
+                on_escape_press();
               break;
 
             default:
@@ -423,7 +472,7 @@ WorldMap::get_input()
         }
     }
 
-  if (!show_menu)
+  if (!Menu::current())
     {
       Uint8 *keystate = SDL_GetKeyState(NULL);
   
@@ -534,8 +583,7 @@ WorldMap::update()
                 }
 
               play_music(song, 1);
-              show_menu = 0;
-              menu_reset();
+              Menu::set_current(0);
               if (!savegame_file.empty())
                 savegame(savegame_file);
               return;
@@ -553,14 +601,16 @@ WorldMap::update()
       tux->update(0.33f);
     }
   
-  if(show_menu)
+  Menu* menu = Menu::current();
+  if(menu)
     {
-      if(current_menu == worldmap_menu)
+      menu->action();
+
+      if(menu == worldmap_menu)
         {
           switch (worldmap_menu->check())
             {
             case 2: // Return to game
-              menu_reset();
               break;
             case 3:
               if (!savegame_file.empty())
@@ -572,6 +622,10 @@ WorldMap::update()
               break;
             }
         }
+      else if(menu == options_menu)
+        {
+          process_options_menu();
+        }
     }
 }
 
@@ -657,7 +711,7 @@ WorldMap::draw_status()
           if (i->x == tux->get_tile_pos().x && 
               i->y == tux->get_tile_pos().y)
             {
-              white_text->draw_align(i->name.c_str(), screen->w/2, screen->h,  A_HMIDDLE, A_BOTTOM);
+              white_text->draw_align(i->title.c_str(), screen->w/2, screen->h,  A_HMIDDLE, A_BOTTOM);
               break;
             }
         }
@@ -667,7 +721,7 @@ WorldMap::draw_status()
 void
 WorldMap::display()
 {
-  show_menu = false;
+  Menu::set_current(0);
 
   quit = false;
 
@@ -692,9 +746,9 @@ WorldMap::display()
     get_input();
     update();
 
-  if(show_menu)
+  if(Menu::current())
     {
-      menu_process_current();
+      Menu::current()->draw();
       mouse_cursor->draw();
     }
     flipscreen();