Merged back changes from 0.3.x branch
[supertux.git] / src / control / joystickkeyboardcontroller.cpp
index 8b214c5..5e2455a 100644 (file)
@@ -1,7 +1,7 @@
 //  $Id$
-// 
+//
 //  SuperTux
-//  Copyright (C) 2005 Matthias Braun <matze@braunis.de>
+//  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 //  GNU General Public License for more details.
-// 
+//
 //  You should have received a copy of the GNU General Public License
 //  along with this program; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-//  02111-1307, USA.
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
 #include <config.h>
 
 #include <sstream>
@@ -28,6 +28,7 @@
 #include "lisp/list_iterator.hpp"
 #include "game_session.hpp"
 #include "console.hpp"
+#include "gameconfig.hpp"
 
 class JoystickKeyboardController::JoystickMenu : public Menu
 {
@@ -52,7 +53,7 @@ public:
   virtual void menu_action(MenuItem* item);
   JoystickKeyboardController* controller;
 };
-  
+
 JoystickKeyboardController::JoystickKeyboardController()
   : wait_for_key(-1), wait_for_joybutton(-1), key_options_menu(0),
     joystick_options_menu(0)
@@ -67,11 +68,13 @@ JoystickKeyboardController::JoystickKeyboardController()
   keymap.insert(std::make_pair(SDLK_LALT, ACTION));
   keymap.insert(std::make_pair(SDLK_ESCAPE, PAUSE_MENU));
   keymap.insert(std::make_pair(SDLK_p, PAUSE_MENU));
-  keymap.insert(std::make_pair(SDLK_PAUSE, PAUSE_MENU));  
+  keymap.insert(std::make_pair(SDLK_PAUSE, PAUSE_MENU));
   keymap.insert(std::make_pair(SDLK_RETURN, MENU_SELECT));
   keymap.insert(std::make_pair(SDLK_KP_ENTER, MENU_SELECT));
   keymap.insert(std::make_pair(SDLK_CARET, CONSOLE));
-  
+  keymap.insert(std::make_pair(SDLK_DELETE, PEEK_LEFT));
+  keymap.insert(std::make_pair(SDLK_END, PEEK_RIGHT));
+
   int joystick_count = SDL_NumJoysticks();
   min_joybuttons = -1;
   max_joybuttons = -1;
@@ -79,19 +82,19 @@ JoystickKeyboardController::JoystickKeyboardController()
     SDL_Joystick* joystick = SDL_JoystickOpen(i);
     bool good = true;
     if(SDL_JoystickNumButtons(joystick) < 2) {
-      log_warning << "Joystick " << i << " has less than 2 buttons" << std::endl;
+      log_info << "Joystick " << i << " has less than 2 buttons" << std::endl;
       good = false;
     }
     if(SDL_JoystickNumAxes(joystick) < 2
        && SDL_JoystickNumHats(joystick) == 0) {
-      log_warning << "Joystick " << i << " has less than 2 axes and no hat" << std::endl;
+      log_info << "Joystick " << i << " has less than 2 axes and no hat" << std::endl;
       good = false;
     }
     if(!good) {
       SDL_JoystickClose(joystick);
       continue;
     }
-    
+
     if(min_joybuttons < 0 || SDL_JoystickNumButtons(joystick) < min_joybuttons)
       min_joybuttons = SDL_JoystickNumButtons(joystick);
     if(SDL_JoystickNumButtons(joystick) > max_joybuttons) {
@@ -106,16 +109,31 @@ JoystickKeyboardController::JoystickKeyboardController()
   joyaxis_y = 1;
   dead_zone_x = 1000;
   dead_zone_y = 1000;
-  
+
   joy_button_map.insert(std::make_pair(0, JUMP));
   joy_button_map.insert(std::make_pair(1, ACTION));
-  // map the last 2 buttons to menu and pause
-  if(min_joybuttons > 2)
-    joy_button_map.insert(std::make_pair(min_joybuttons-1, PAUSE_MENU));
-  // map all remaining joystick buttons to MENU_SELECT
-  for(int i = 2; i < max_joybuttons; ++i) {
-    if(i != min_joybuttons-1)
-      joy_button_map.insert(std::make_pair(i, MENU_SELECT));
+  // 6 or more Buttons
+  if( min_joybuttons > 5 ){
+    joy_button_map.insert(std::make_pair( 4, PEEK_LEFT));
+    joy_button_map.insert(std::make_pair( 5, PEEK_RIGHT));
+    // 8 or more
+    if(min_joybuttons > 7)
+      joy_button_map.insert(std::make_pair(min_joybuttons-1, PAUSE_MENU));
+    // map all remaining joystick buttons to MENU_SELECT
+    for(int i = 2; i < max_joybuttons; ++i) {
+      if( i != min_joybuttons-1 && i !=4  && i!= 5 )
+        joy_button_map.insert(std::make_pair(i, MENU_SELECT));
+    }
+
+  } else {
+    // map the last 2 buttons to menu and pause
+    if(min_joybuttons > 2)
+      joy_button_map.insert(std::make_pair(min_joybuttons-1, PAUSE_MENU));
+    // map all remaining joystick buttons to MENU_SELECT
+    for(int i = 2; i < max_joybuttons; ++i) {
+      if(i != min_joybuttons-1)
+        joy_button_map.insert(std::make_pair(i, MENU_SELECT));
+    }
   }
 
   // some joysticks or SDL seem to produce some bogus events after being opened
@@ -153,7 +171,7 @@ JoystickKeyboardController::read(const lisp::Lisp& lisp)
         map->get("key", key);
         map->get("control", control);
         if(key < SDLK_FIRST || key >= SDLK_LAST) {
-          log_warning << "Invalid key '" << key << "' in keymap" << std::endl;
+          log_info << "Invalid key '" << key << "' in keymap" << std::endl;
           continue;
         }
 
@@ -163,12 +181,12 @@ JoystickKeyboardController::read(const lisp::Lisp& lisp)
             break;
         }
         if(controlNames[i] == 0) {
-          log_warning << "Invalid control '" << control << "' in keymap" << std::endl;
+          log_info << "Invalid control '" << control << "' in keymap" << std::endl;
           continue;
         }
         keymap.insert(std::make_pair((SDLKey) key, (Control) i));
       } else {
-        log_warning << "Invalid lisp element '" << iter.item() << "' in keymap" << std::endl;
+        log_info << "Invalid lisp element '" << iter.item() << "' in keymap" << std::endl;
       }
     }
   }
@@ -189,17 +207,17 @@ JoystickKeyboardController::read(const lisp::Lisp& lisp)
         map->get("button", button);
         map->get("control", control);
         if(button < 0 || button >= max_joybuttons) {
-          log_warning << "Invalid button '" << button << "' in buttonmap" << std::endl;
+          log_info << "Invalid button '" << button << "' in buttonmap" << std::endl;
           continue;
         }
-        
+
         int i = 0;
         for(i = 0; controlNames[i] != 0; ++i) {
           if(control == controlNames[i])
             break;
-        }                                                                           
+        }
         if(controlNames[i] == 0) {
-          log_warning << "Invalid control '" << control << "' in buttonmap" << std::endl;
+          log_info << "Invalid control '" << control << "' in buttonmap" << std::endl;
           continue;
         }
         reset_joybutton(button, (Control) i);
@@ -232,7 +250,7 @@ JoystickKeyboardController::write(lisp::Writer& writer)
     writer.write_string("control", controlNames[i->second]);
     writer.end_list("map");
   }
-  writer.end_list("joystick");  
+  writer.end_list("joystick");
 }
 
 void
@@ -279,7 +297,7 @@ JoystickKeyboardController::process_event(const SDL_Event& event)
     case SDL_JOYHATMOTION:
       if(!use_hat)
         break;
-      
+
       if(event.jhat.value & SDL_HAT_UP) {
         controls[UP] = true;
         controls[DOWN] = false;
@@ -324,9 +342,8 @@ JoystickKeyboardController::process_event(const SDL_Event& event)
         log_debug << "Unmapped joybutton " << (int)event.jbutton.button << " pressed" << std::endl;
         return;
       }
-      
-      controls[i->second] =
-        event.type == SDL_JOYBUTTONDOWN ? true : false;
+
+      controls[i->second] = (event.type == SDL_JOYBUTTONDOWN);
       break;
     }
 
@@ -351,10 +368,10 @@ JoystickKeyboardController::process_key_event(const SDL_Event& event)
   if (Console::instance->hasFocus()) {
     process_console_key_event(event);
     return;
-  } 
+  }
 
   // if menu mode: send key there
-  if (Menu::current()) { 
+  if (Menu::current()) {
     process_menu_key_event(event);
     return;
   }
@@ -365,7 +382,7 @@ JoystickKeyboardController::process_key_event(const SDL_Event& event)
     return;
   }
   Control control = key_mapping->second;
-  controls[control] = event.type == SDL_KEYDOWN ? true : false;
+  controls[control] = (event.type == SDL_KEYDOWN);
 }
 
 void
@@ -392,6 +409,12 @@ JoystickKeyboardController::process_console_key_event(const SDL_Event& event)
     case SDLK_END:
       Console::instance->scroll(+65535);
       break;
+    case SDLK_UP:
+      Console::instance->show_history(-1);
+      break;
+    case SDLK_DOWN:
+      Console::instance->show_history(+1);
+      break;
     default:
       int c = event.key.keysym.unicode;
       if ((c >= 32) && (c <= 126)) {
@@ -409,7 +432,7 @@ JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
     if(event.type == SDL_KEYUP)
       return;
 
-    if(event.key.keysym.sym != SDLK_ESCAPE                      
+    if(event.key.keysym.sym != SDLK_ESCAPE
         && event.key.keysym.sym != SDLK_PAUSE) {
       reset_key(event.key.keysym.sym, (Control) wait_for_key);
     }
@@ -417,7 +440,7 @@ JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
     key_options_menu->update();
     wait_for_key = -1;
     return;
-  } 
+  }
   if(wait_for_joybutton >= 0) {
     if(event.key.keysym.sym == SDLK_ESCAPE) {
       reset();
@@ -426,7 +449,7 @@ JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
     }
     return;
   }
+
   Control control;
   /* we use default keys when the menu is open (to avoid problems when
    * redefining keys to invalid settings
@@ -458,7 +481,7 @@ JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
       break;
   }
 
-  controls[control] = event.type == SDL_KEYDOWN ? true : false;
+  controls[control] = (event.type == SDL_KEYDOWN);
 }
 
 void
@@ -563,14 +586,19 @@ JoystickKeyboardController::KeyboardMenu::KeyboardMenu(
     JoystickKeyboardController* _controller)
   : controller(_controller)
 {
-    add_label(_("Keyboard Setup"));
+    add_label(_("Setup Keyboard"));
     add_hl();
     add_controlfield(Controller::UP, _("Up"));
     add_controlfield(Controller::DOWN, _("Down"));
     add_controlfield(Controller::LEFT, _("Left"));
     add_controlfield(Controller::RIGHT, _("Right"));
     add_controlfield(Controller::JUMP, _("Jump"));
-    add_controlfield(Controller::ACTION, _("Shoot/Run"));
+    add_controlfield(Controller::ACTION, _("Action"));
+    add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
+    add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
+    if (config->console_enabled) {
+      add_controlfield(Controller::CONSOLE, _("Console"));
+    }
     add_hl();
     add_back(_("Back"));
     update();
@@ -638,6 +666,14 @@ JoystickKeyboardController::KeyboardMenu::update()
     controller->reversemap_key(Controller::JUMP)));
   get_item_by_id((int) Controller::ACTION).change_input(get_key_name(
     controller->reversemap_key(Controller::ACTION)));
+  get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_key_name(
+    controller->reversemap_key(Controller::PEEK_LEFT)));
+  get_item_by_id((int) Controller::PEEK_RIGHT).change_input(get_key_name(
+    controller->reversemap_key(Controller::PEEK_RIGHT)));
+  if (config->console_enabled) {
+    get_item_by_id((int) Controller::CONSOLE).change_input(get_key_name(
+      controller->reversemap_key(Controller::CONSOLE)));
+  }
 }
 
 //---------------------------------------------------------------------------
@@ -646,12 +682,14 @@ JoystickKeyboardController::JoystickMenu::JoystickMenu(
   JoystickKeyboardController* _controller)
   : controller(_controller)
 {
-  add_label(_("Joystick Setup"));
+  add_label(_("Setup Joystick"));
   add_hl();
   if(controller->joysticks.size() > 0) {
     add_controlfield(Controller::JUMP, _("Jump"));
-    add_controlfield(Controller::ACTION, _("Shoot/Run"));
+    add_controlfield(Controller::ACTION, _("Action"));
     add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
+    add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
+    add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
   } else {
     add_deactive(-1, _("No Joysticks found"));
   }
@@ -668,7 +706,7 @@ JoystickKeyboardController::JoystickMenu::get_button_name(int button)
 {
   if(button < 0)
     return _("None");
-    
+
   std::ostringstream name;
   name << "Button " << button;
   return name.str();
@@ -695,5 +733,8 @@ JoystickKeyboardController::JoystickMenu::update()
     controller->reversemap_joybutton(Controller::ACTION)));
   get_item_by_id((int) Controller::PAUSE_MENU).change_input(get_button_name(
     controller->reversemap_joybutton(Controller::PAUSE_MENU)));
+  get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_button_name(
+    controller->reversemap_joybutton(Controller::PEEK_LEFT)));
+  get_item_by_id((int) Controller::PEEK_RIGHT).change_input(get_button_name(
+    controller->reversemap_joybutton(Controller::PEEK_RIGHT)));
 }
-