diff options
-rw-r--r-- | doc/TODO | 10 | ||||
-rw-r--r-- | src/client/Makefile.am | 8 | ||||
-rw-r--r-- | src/client/input.cc | 96 | ||||
-rw-r--r-- | src/client/key.h | 5 | ||||
-rw-r--r-- | src/client/keyboard.cc | 78 | ||||
-rw-r--r-- | src/client/keyboard.h | 11 |
6 files changed, 159 insertions, 49 deletions
@@ -14,7 +14,7 @@ milestone 2: targetting system server-client event system, hit-once lightweight entities explosion events - weapons fire events + weapon fire events filesystem: write a filesystem based on streams @@ -33,10 +33,10 @@ core: parse command line options (ok) execute command line options (ok) globe entity (ok) - refactor 'say', it should not be a game function (ok) + execute config files (ok) + zones - execute config files (ok, autoexec.cfg still missing) game module loading/unloading network: @@ -74,8 +74,8 @@ render: fix lighting without sun sound: - engine sounds - user interface sounds + engine sounds (ok) + user interface sounds (ok) win32 port: network not functional (ok) diff --git a/src/client/Makefile.am b/src/client/Makefile.am index 39b53cf..46b8e21 100644 --- a/src/client/Makefile.am +++ b/src/client/Makefile.am @@ -7,12 +7,12 @@ else noinst_LTLIBRARIES = libclient.la endif -libclient_la_SOURCES = chat.cc client.cc console.cc hud.cc input.cc key.cc \ - keyboard.cc targets.cc video.cc view.cc +libclient_la_SOURCES = action.cc chat.cc client.cc console.cc hud.cc input.cc \ + key.cc keyboard.cc targets.cc video.cc view.cc libclient_la_CFLAGS = $(LIBSDL_CFLAGS) $(GL_CFLAGS) libclient_la_LDFLAGS = -avoid-version -no-undefined $(GL_LIBS) $(LIBSDL_LIBS) -noinst_HEADERS = chat.h client.h console.h input.h key.h keyboard.h targets.h \ - video.h view.h +noinst_HEADERS = action.h chat.h client.h console.h input.h key.h keyboard.h \ + targets.h video.h view.h libclient_la_LIBADD = $(top_builddir)/src/render/librender.la \ $(top_builddir)/src/core/libcore.la diff --git a/src/client/input.cc b/src/client/input.cc index dc40b8f..775f03a 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -59,9 +59,6 @@ bool mouse_control = false; const float thruster_offset = 0.05f; -// small hack to prevent two sounds triggered by the scrollwheel -bool singleclick = true; - //--- engine functions -------------------------------------------- void func_screenshot(std::string const & args) @@ -114,16 +111,42 @@ void func_ui_view(std::string const &args) } } -void func_list_keys(std::string const &args) +void func_list_actions(std::string const &args) { if (keyboard) - keyboard->list_keys(); + keyboard->list_actions(); + else + con_warn << "Keyboard handler not installed!" << std::endl; +} + +void func_list_keys(std::string const &args) +{ + if (keyboard) { + std::stringstream argstr(args); + std::string keyname; + if (argstr >> keyname) { + keyboard->list_bind(keyname); + } else { + keyboard->list_keys(); + } + } else { + con_warn << "Keyboard handler not installed!" << std::endl; + } } void func_list_binds(std::string const &args) { - if (keyboard) - keyboard->list_binds(); + if (keyboard) { + std::stringstream argstr(args); + std::string keyname; + if (argstr >> keyname) { + keyboard->list_bind(keyname); + } else { + keyboard->list_binds(); + } + } else { + con_warn << "Keyboard handler not installed!" << std::endl; + } } void func_bind(std::string const &args) @@ -134,28 +157,36 @@ void func_bind(std::string const &args) if (argstr >> keyname) { if (args.size() > keyname.size()+1) { keyboard->bind(keyname, args.substr(keyname.size()+1)); - return; + } else { + keyboard->list_bind(keyname); } + return; } - } + core::Func *func = core::Func::find("bind"); + con_print << "bind " << func->info() << std::endl; - core::Func *func = core::Func::find("bind"); - con_print << "bind " << func->info() << std::endl; + } else { + con_warn << "Keyboard handler not installed!" << std::endl; + } } void func_unbind(std::string const &args) { if (keyboard) { + std::stringstream argstr(args); std::string keyname; if (argstr >> keyname) { keyboard->unbind(keyname); return; } - } - core::Func *func = core::Func::find("unbind"); - con_print << "unbind " << func->info() << std::endl; + core::Func *func = core::Func::find("unbind"); + con_print << "unbind " << func->info() << std::endl; + + } else { + con_warn << "Keyboard handler not installed!" << std::endl; + } } //--- input functions --------------------------------------------- @@ -189,11 +220,14 @@ void init() func = core::Func::add("ui_control",func_ui_control); func->set_info("toggle mouse control"); + func = core::Func::add("list_actions", func_list_actions); + func->set_info("list key action names"); + func = core::Func::add("list_keys", func_list_keys); - func->set_info("list keyboard key names"); + func->set_info("list key names"); func = core::Func::add("list_binds",func_list_binds); - func->set_info("list keyboard binds"); + func->set_info("list keyb binds"); func = core::Func::add("bind", (core::FuncPtr) func_bind); func->set_info("[key] [str] bind a command to a key"); @@ -214,6 +248,7 @@ void shutdown() { con_print << "^BShutting down input..." << std::endl; + core::Func::remove("list_actions"); core::Func::remove("list_keys"); core::Func::remove("list_binds"); @@ -241,19 +276,11 @@ void shutdown() void action_press(std::string const &action) { /* -- thruster ------------------------------------ */ - if (action.compare("+thrust") == 0) { - if (local_thrust < 1.0f && singleclick) { - //audio::play("ui/thruster"); - singleclick = false; - } + if (action.compare("+thrustup") == 0) { local_thrust += thruster_offset; - } else if (action.compare("-thrust") == 0) { - if (local_thrust > 0.0f && singleclick) { - //audio::play("ui/thruster"); - singleclick = false; - } + } else if (action.compare("+thrustdown") == 0) { local_thrust -= 2.0f * thruster_offset; /* -- mouse control ------------------------------- */ @@ -298,10 +325,10 @@ void action_press(std::string const &action) void action_release(std::string const &action) { /* -- thruster ------------------------------------ */ - if (action.compare("+thrust") == 0) { + if (action.compare("+thrustup") == 0) { - } else if (action.compare("-thrust") == 0) { + } else if (action.compare("+thrustdown") == 0) { /* -- mouse control ------------------------------- */ @@ -372,7 +399,6 @@ void frame(float seconds) SDL_Event event; Key *key = 0; bool pressed = false; - singleclick = true; while (SDL_PollEvent(&event)) { pressed = false; @@ -450,7 +476,7 @@ void frame(float seconds) } else { // FIXME modifier char c = key->bind(Key::None).c_str()[0]; - if (c == '+' || c == '-') { + if (c == '+') { // action bind action_press(key->bind(Key::None)); @@ -464,7 +490,7 @@ void frame(float seconds) // FIXME modifier char c = key->bind(Key::None).c_str()[0]; - if (c && c != '+' && c != '-') { + if (c && c != '+') { // normal bind core::cmd() << key->bind(Key::None) << "\n"; } @@ -475,7 +501,7 @@ void frame(float seconds) if (core::application()->connected() && core::localcontrol() && !console()->visible() && !chat::visible()) { // FIXME modifier (note: mmmmm, modifier could be released by now) char c = key->bind(Key::None).c_str()[0]; - if (c == '+' || c == '-') { + if (c == '+') { // action bind action_release(key->bind(Key::None)); } @@ -586,8 +612,12 @@ void frame(float seconds) math::clamp(local_direction, -1.0f, 1.0f); math::clamp(local_pitch, -1.0f, 1.0f); - math::clamp(local_thrust, 0.0f, 1.0f); math::clamp(local_roll, -1.0f, 1.0f); + math::clamp(local_thrust, 0.0f, 1.0f); + if (local_thrust < 0.01f) + local_thrust = 0.0f; + else if (local_thrust > 0.99f) + local_thrust = 1.0f; core::localcontrol()->set_thrust(local_thrust); core::localcontrol()->set_direction(local_direction); diff --git a/src/client/key.h b/src/client/key.h index 344e1fa..bd6f6bd 100644 --- a/src/client/key.h +++ b/src/client/key.h @@ -11,6 +11,11 @@ namespace client { +/// a pressable key +/** + * a Key instance can contain any kind of 'key' like a keyboard key, + * a mouse button, or a joystick button + */ class Key { public: diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index c569499..da93814 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -28,6 +28,31 @@ Keyboard::Keyboard() numlock = false; capslock = false; + // ------------------ ACTIONS + + // note: actions should be state keys and not use key repeat + // FIXME: thruster should be a state key + + add_action("+left", Action::None, "rotate left"); + add_action("+right", Action::None, "rotate right"); + add_action("+up", Action::None, "rotate up"); + add_action("+down", Action::None, "rotate down"); + + add_action("+rollleft", Action::None, "roll left"); + add_action("+rollright", Action::None, "roll right"); + + add_action("+camleft", Action::None, "rotate camera left"); + add_action("+camright", Action::None, "rotate camera right"); + add_action("+camup", Action::None, "rotate camera up"); + add_action("+camdown", Action::None, "rotate camera down"); + + add_action("+thrustup", Action::None, "increase thruster"); + add_action("+thrustdown", Action::None, "decrease thruster"); + + add_action("+control", Action::None, "enable mouse control while pressed"); + + // ------------------ KEYS + add_key("backspace", SDLK_BACKSPACE); add_key("tab", SDLK_TAB); add_key("clear", SDLK_CLEAR); @@ -117,8 +142,8 @@ Keyboard::Keyboard() add_key("kpperiod", SDLK_KP_PERIOD, '.'); add_key("kpdiv", SDLK_KP_DIVIDE, '/', "+rollleft"); add_key("kpmul", SDLK_KP_MULTIPLY, '*', "+rollright"); - add_key("kpmin", SDLK_KP_MINUS, '-', "-thrust"); - add_key("kpplus", SDLK_KP_PLUS, '+', "+thrust"); + add_key("kpmin", SDLK_KP_MINUS, '-', "+thrustdown"); + add_key("kpplus", SDLK_KP_PLUS, '+', "+thrustup"); add_key("kpenter", SDLK_KP_ENTER, '\n'); add_key("kpequal", SDLK_KP_EQUALS, '='); @@ -181,16 +206,21 @@ Keyboard::Keyboard() add_key("mouse2", 512 + SDL_BUTTON_RIGHT); add_key("mouse3", 512 + SDL_BUTTON_MIDDLE); - add_key("mouse4", 512 + SDL_BUTTON_WHEELUP, 0, "+thrust"); - add_key("mouse5", 512 + SDL_BUTTON_WHEELDOWN, 0, "-thrust"); + add_key("mouse4", 512 + SDL_BUTTON_WHEELUP, 0, "+thrustup"); + add_key("mouse5", 512 + SDL_BUTTON_WHEELDOWN, 0, "+thrustdown"); } Keyboard::~Keyboard() { + // clear key map for (iterator it = begin(); it != end(); it++) delete(*it).second; - keys.clear(); + + // clear action list + for(std::list<Action *>::iterator ait = actions.begin(); ait != actions.end(); ait++) + delete (*ait); + actions.clear(); } void Keyboard::save_binds() @@ -323,12 +353,46 @@ void Keyboard::add_key(const char *name, const unsigned int keysym, const char a keys[keysym] = new Key(name, keysym, ascii, bind); } +void Keyboard::add_action(const char *name, Action::Identifier action, const char *info) +{ + actions.push_back(new Action(name, action, info)); +} + +void Keyboard::list_actions() +{ + for (std::list<Action *>::iterator it = actions.begin(); it != actions.end(); it++) { + con_print << " " << (*it)->name() << " " << (*it)->info() << std::endl; + } + con_print << actions.size() << " registered actions" << std::endl; +} + void Keyboard::list_keys() { for (iterator it = begin(); it != end(); it++) { con_print << " " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::None) << std::endl; } - con_print << keys.size() << " keys" << std::endl; + con_print << keys.size() << " registered keys" << std::endl; +} + +void Keyboard::list_bind(std::string const &name) +{ + Key *key = find(name); + if (key) { + if (key->bind(Key::None).size()) { + con_print << " " << aux::pad_left(key->name(), 6) << " " << key->bind(Key::None) << std::endl; + } + if (key->bind(Key::Shift).size()) { + con_print << " shift+" << aux::pad_left(key->name(), 6) << " " << key->bind(Key::Shift) << std::endl; + } + if (key->bind(Key::Ctrl).size()) { + con_print << " ctrl+" << aux::pad_left(key->name(), 6) << " " << key->bind(Key::Ctrl) << std::endl; + } + if (key->bind(Key::Alt).size()) { + con_print << " alt+" << aux::pad_left(key->name(), 6) << " " << key->bind(Key::Alt) << std::endl; + } + } else { + con_print << "key '" << name << "' not found" << std::endl; + } } void Keyboard::list_binds() @@ -353,7 +417,7 @@ void Keyboard::list_binds() } } - con_print << n << " binds" << std::endl; + con_print << n << " registered binds" << std::endl; } void setkeyboardmode(bool input) diff --git a/src/client/keyboard.h b/src/client/keyboard.h index 8275b1a..1c70179 100644 --- a/src/client/keyboard.h +++ b/src/client/keyboard.h @@ -9,9 +9,11 @@ #include <string> #include <map> +#include <list> #include "SDL/SDL.h" +#include "client/action.h" #include "client/key.h" namespace client { @@ -40,9 +42,15 @@ public: /// list keyboard key names void list_keys(); + /// list actions + void list_actions(); + /// list keyboard binds void list_binds(); + /// list binds for a singe key + void list_bind(std::string const &name); + /// load keyboard binds void load_binds(); @@ -64,7 +72,10 @@ private: void add_key(const char *name, const unsigned int keysym, const char ascii=0, const char *bind=0); + void add_action(const char *name, Action::Identifier action, const char *info = 0); + std::map<unsigned int, Key *> keys; + std::list<Action *> actions; bool numlock; bool capslock; |