#include "lisp/list_iterator.hpp"
#include "game_session.hpp"
#include "console.hpp"
+#include "gameconfig.hpp"
class JoystickKeyboardController::JoystickMenu : public Menu
{
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)
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;
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) {
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
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;
}
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;
}
}
}
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);
writer.write_string("control", controlNames[i->second]);
writer.end_list("map");
}
- writer.end_list("joystick");
+ writer.end_list("joystick");
}
void
case SDL_JOYHATMOTION:
if(!use_hat)
break;
-
+
if(event.jhat.value & SDL_HAT_UP) {
controls[UP] = true;
controls[DOWN] = false;
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;
}
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;
}
return;
}
Control control = key_mapping->second;
- controls[control] = event.type == SDL_KEYDOWN ? true : false;
+ controls[control] = (event.type == SDL_KEYDOWN);
}
void
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)) {
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);
}
key_options_menu->update();
wait_for_key = -1;
return;
- }
+ }
if(wait_for_joybutton >= 0) {
if(event.key.keysym.sym == SDLK_ESCAPE) {
reset();
}
return;
}
-
+
Control control;
/* we use default keys when the menu is open (to avoid problems when
* redefining keys to invalid settings
break;
}
- controls[control] = event.type == SDL_KEYDOWN ? true : false;
+ controls[control] = (event.type == SDL_KEYDOWN);
}
void
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();
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)));
+ }
}
//---------------------------------------------------------------------------
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"));
}
{
if(button < 0)
return _("None");
-
+
std::ostringstream name;
name << "Button " << button;
return name.str();
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)));
}
-