Added key configuration in the configuration file.

This commit is contained in:
Perttu Ahola 2011-05-14 15:43:26 +03:00
parent 0674db4a6b
commit 974c5cc08c
8 changed files with 280 additions and 25 deletions

View File

@ -11,6 +11,19 @@
# Client side stuff # Client side stuff
# #
#keymap_forward = KEY_KEY_W
#keymap_backward = KEY_KEY_S
#keymap_left = KEY_KEY_A
#keymap_right = KEY_KEY_D
#keymap_jump = KEY_SPACE
#keymap_sneak = KEY_RSHIFT
#keymap_inventory = KEY_KEY_I
#keymap_chat = KEY_KEY_T
#keymap_rangeselect = KEY_KEY_R
# Some (temporary) keys for debugging
#keymap_special1 = KEY_KEY_E
#keymap_print_debug_stacks = KEY_KEY_P
#wanted_fps = 30 #wanted_fps = 30
#fps_max = 60 #fps_max = 60
#viewing_range_nodes_max = 300 #viewing_range_nodes_max = 300

View File

@ -81,6 +81,7 @@ set(common_SRCS
# Client sources # Client sources
set(minetest_SRCS set(minetest_SRCS
${common_SRCS} ${common_SRCS}
keycode.cpp
clouds.cpp clouds.cpp
clientobject.cpp clientobject.cpp
guiFurnaceMenu.cpp guiFurnaceMenu.cpp

View File

@ -24,18 +24,33 @@ extern Settings g_settings;
void set_default_settings() void set_default_settings()
{ {
// Client and server // Client and server
g_settings.setDefault("port", "");
g_settings.setDefault("name", "");
g_settings.setDefault("footprints", "false"); g_settings.setDefault("footprints", "false");
// Client stuff // Client stuff
g_settings.setDefault("keymap_forward", "KEY_KEY_W");
g_settings.setDefault("keymap_backward", "KEY_KEY_S");
g_settings.setDefault("keymap_left", "KEY_KEY_A");
g_settings.setDefault("keymap_right", "KEY_KEY_D");
g_settings.setDefault("keymap_jump", "KEY_SPACE");
g_settings.setDefault("keymap_sneak", "KEY_RSHIFT");
g_settings.setDefault("keymap_inventory", "KEY_KEY_I");
g_settings.setDefault("keymap_chat", "KEY_KEY_T");
g_settings.setDefault("keymap_rangeselect", "KEY_KEY_R");
// Some (temporary) keys for debugging
g_settings.setDefault("keymap_special1", "KEY_KEY_E");
g_settings.setDefault("keymap_print_debug_stacks", "KEY_KEY_P");
g_settings.setDefault("wanted_fps", "30"); g_settings.setDefault("wanted_fps", "30");
g_settings.setDefault("fps_max", "60"); g_settings.setDefault("fps_max", "60");
g_settings.setDefault("viewing_range_nodes_max", "300"); g_settings.setDefault("viewing_range_nodes_max", "300");
g_settings.setDefault("viewing_range_nodes_min", "35"); g_settings.setDefault("viewing_range_nodes_min", "35");
g_settings.setDefault("screenW", "800"); g_settings.setDefault("screenW", "800");
g_settings.setDefault("screenH", "600"); g_settings.setDefault("screenH", "600");
g_settings.setDefault("port", "");
g_settings.setDefault("address", ""); g_settings.setDefault("address", "");
g_settings.setDefault("name", "");
g_settings.setDefault("random_input", "false"); g_settings.setDefault("random_input", "false");
g_settings.setDefault("client_delete_unused_sectors_timeout", "1200"); g_settings.setDefault("client_delete_unused_sectors_timeout", "1200");
g_settings.setDefault("enable_fog", "true"); g_settings.setDefault("enable_fog", "true");

View File

@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "materials.h" #include "materials.h"
#include "config.h" #include "config.h"
#include "clouds.h" #include "clouds.h"
#include "keycode.h"
/* /*
Setting this to 1 enables a special camera mode that forces Setting this to 1 enables a special camera mode that forces
@ -1079,7 +1080,7 @@ void the_game(
/* /*
Launch menus according to keys Launch menus according to keys
*/ */
if(input->wasKeyDown(irr::KEY_KEY_I)) if(input->wasKeyDown(getKeySetting("keymap_inventory")))
{ {
dstream<<DTIME<<"the_game: " dstream<<DTIME<<"the_game: "
<<"Launching inventory"<<std::endl; <<"Launching inventory"<<std::endl;
@ -1105,7 +1106,7 @@ void the_game(
menu->drop(); menu->drop();
} }
else if(input->wasKeyDown(irr::KEY_ESCAPE)) else if(input->wasKeyDown(KEY_ESCAPE))
{ {
dstream<<DTIME<<"the_game: " dstream<<DTIME<<"the_game: "
<<"Launching pause menu"<<std::endl; <<"Launching pause menu"<<std::endl;
@ -1113,7 +1114,7 @@ void the_game(
(new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback, (new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback,
&g_menumgr))->drop(); &g_menumgr))->drop();
} }
else if(input->wasKeyDown(irr::KEY_KEY_T)) else if(input->wasKeyDown(getKeySetting("keymap_chat")))
{ {
TextDest *dest = new TextDestChat(&client); TextDest *dest = new TextDestChat(&client);
@ -1163,7 +1164,7 @@ void the_game(
} }
// Viewing range selection // Viewing range selection
if(input->wasKeyDown(irr::KEY_KEY_R)) if(input->wasKeyDown(getKeySetting("keymap_rangeselect")))
{ {
if(draw_control.range_all) if(draw_control.range_all)
{ {
@ -1178,7 +1179,7 @@ void the_game(
} }
// Print debug stacks // Print debug stacks
if(input->wasKeyDown(irr::KEY_KEY_P)) if(input->wasKeyDown(getKeySetting("keymap_print_debug_stacks")))
{ {
dstream<<"-----------------------------------------" dstream<<"-----------------------------------------"
<<std::endl; <<std::endl;
@ -1190,6 +1191,7 @@ void the_game(
/* /*
Player speed control Player speed control
TODO: Cache the keycodes from getKeySetting
*/ */
{ {
@ -1203,14 +1205,13 @@ void the_game(
float a_pitch, float a_pitch,
float a_yaw*/ float a_yaw*/
PlayerControl control( PlayerControl control(
input->isKeyDown(irr::KEY_KEY_W), input->isKeyDown(getKeySetting("keymap_forward")),
input->isKeyDown(irr::KEY_KEY_S), input->isKeyDown(getKeySetting("keymap_backward")),
input->isKeyDown(irr::KEY_KEY_A), input->isKeyDown(getKeySetting("keymap_left")),
input->isKeyDown(irr::KEY_KEY_D), input->isKeyDown(getKeySetting("keymap_right")),
input->isKeyDown(irr::KEY_SPACE), input->isKeyDown(getKeySetting("keymap_jump")),
input->isKeyDown(irr::KEY_KEY_E), input->isKeyDown(getKeySetting("keymap_special1")),
input->isKeyDown(irr::KEY_LSHIFT) input->isKeyDown(getKeySetting("keymap_sneak")),
|| input->isKeyDown(irr::KEY_RSHIFT),
camera_pitch, camera_pitch,
camera_yaw camera_yaw
); );
@ -1281,7 +1282,7 @@ void the_game(
s32 dy = input->getMousePos().Y - displaycenter.Y; s32 dy = input->getMousePos().Y - displaycenter.Y;
//std::cout<<"window active, pos difference "<<dx<<","<<dy<<std::endl; //std::cout<<"window active, pos difference "<<dx<<","<<dy<<std::endl;
const float keyspeed = 500; /*const float keyspeed = 500;
if(input->isKeyDown(irr::KEY_UP)) if(input->isKeyDown(irr::KEY_UP))
dy -= dtime * keyspeed; dy -= dtime * keyspeed;
if(input->isKeyDown(irr::KEY_DOWN)) if(input->isKeyDown(irr::KEY_DOWN))
@ -1289,7 +1290,7 @@ void the_game(
if(input->isKeyDown(irr::KEY_LEFT)) if(input->isKeyDown(irr::KEY_LEFT))
dx -= dtime * keyspeed; dx -= dtime * keyspeed;
if(input->isKeyDown(irr::KEY_RIGHT)) if(input->isKeyDown(irr::KEY_RIGHT))
dx += dtime * keyspeed; dx += dtime * keyspeed;*/
camera_yaw -= dx*0.2; camera_yaw -= dx*0.2;
camera_pitch += dy*0.2; camera_pitch += dy*0.2;

View File

@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "guiInventoryMenu.h" #include "guiInventoryMenu.h"
#include "constants.h" #include "constants.h"
#include "keycode.h"
void drawInventoryItem(video::IVideoDriver *driver, void drawInventoryItem(video::IVideoDriver *driver,
gui::IGUIFont *font, gui::IGUIFont *font,
@ -293,7 +294,7 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
quitMenu(); quitMenu();
return true; return true;
} }
if(event.KeyInput.Key==KEY_KEY_I && event.KeyInput.PressedDown) if(event.KeyInput.Key==getKeySetting("keymap_inventory") && event.KeyInput.PressedDown)
{ {
quitMenu(); quitMenu();
return true; return true;

192
src/keycode.cpp Normal file
View File

@ -0,0 +1,192 @@
/*
Minetest-c55
Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "keycode.h"
#include "main.h" // For g_settings
#define CHECKKEY(x){if(strcmp(name, #x)==0) return irr::x;}
irr::EKEY_CODE keyname_to_keycode(const char *name)
{
CHECKKEY(KEY_LBUTTON)
CHECKKEY(KEY_RBUTTON)
CHECKKEY(KEY_CANCEL)
CHECKKEY(KEY_MBUTTON)
CHECKKEY(KEY_XBUTTON1)
CHECKKEY(KEY_XBUTTON2)
CHECKKEY(KEY_BACK)
CHECKKEY(KEY_TAB)
CHECKKEY(KEY_CLEAR)
CHECKKEY(KEY_RETURN)
CHECKKEY(KEY_SHIFT)
CHECKKEY(KEY_CONTROL)
CHECKKEY(KEY_MENU)
CHECKKEY(KEY_PAUSE)
CHECKKEY(KEY_CAPITAL)
CHECKKEY(KEY_KANA)
CHECKKEY(KEY_HANGUEL)
CHECKKEY(KEY_HANGUL)
CHECKKEY(KEY_JUNJA)
CHECKKEY(KEY_FINAL)
CHECKKEY(KEY_HANJA)
CHECKKEY(KEY_KANJI)
CHECKKEY(KEY_ESCAPE)
CHECKKEY(KEY_CONVERT)
CHECKKEY(KEY_NONCONVERT)
CHECKKEY(KEY_ACCEPT)
CHECKKEY(KEY_MODECHANGE)
CHECKKEY(KEY_SPACE)
CHECKKEY(KEY_PRIOR)
CHECKKEY(KEY_NEXT)
CHECKKEY(KEY_END)
CHECKKEY(KEY_HOME)
CHECKKEY(KEY_LEFT)
CHECKKEY(KEY_UP)
CHECKKEY(KEY_RIGHT)
CHECKKEY(KEY_DOWN)
CHECKKEY(KEY_SELECT)
CHECKKEY(KEY_PRINT)
CHECKKEY(KEY_EXECUT)
CHECKKEY(KEY_SNAPSHOT)
CHECKKEY(KEY_INSERT)
CHECKKEY(KEY_DELETE)
CHECKKEY(KEY_HELP)
CHECKKEY(KEY_KEY_0)
CHECKKEY(KEY_KEY_1)
CHECKKEY(KEY_KEY_2)
CHECKKEY(KEY_KEY_3)
CHECKKEY(KEY_KEY_4)
CHECKKEY(KEY_KEY_5)
CHECKKEY(KEY_KEY_6)
CHECKKEY(KEY_KEY_7)
CHECKKEY(KEY_KEY_8)
CHECKKEY(KEY_KEY_9)
CHECKKEY(KEY_KEY_A)
CHECKKEY(KEY_KEY_B)
CHECKKEY(KEY_KEY_C)
CHECKKEY(KEY_KEY_D)
CHECKKEY(KEY_KEY_E)
CHECKKEY(KEY_KEY_F)
CHECKKEY(KEY_KEY_G)
CHECKKEY(KEY_KEY_H)
CHECKKEY(KEY_KEY_I)
CHECKKEY(KEY_KEY_J)
CHECKKEY(KEY_KEY_K)
CHECKKEY(KEY_KEY_L)
CHECKKEY(KEY_KEY_M)
CHECKKEY(KEY_KEY_N)
CHECKKEY(KEY_KEY_O)
CHECKKEY(KEY_KEY_P)
CHECKKEY(KEY_KEY_Q)
CHECKKEY(KEY_KEY_R)
CHECKKEY(KEY_KEY_S)
CHECKKEY(KEY_KEY_T)
CHECKKEY(KEY_KEY_U)
CHECKKEY(KEY_KEY_V)
CHECKKEY(KEY_KEY_W)
CHECKKEY(KEY_KEY_X)
CHECKKEY(KEY_KEY_Y)
CHECKKEY(KEY_KEY_Z)
CHECKKEY(KEY_LWIN)
CHECKKEY(KEY_RWIN)
CHECKKEY(KEY_APPS)
CHECKKEY(KEY_SLEEP)
CHECKKEY(KEY_NUMPAD0)
CHECKKEY(KEY_NUMPAD1)
CHECKKEY(KEY_NUMPAD2)
CHECKKEY(KEY_NUMPAD3)
CHECKKEY(KEY_NUMPAD4)
CHECKKEY(KEY_NUMPAD5)
CHECKKEY(KEY_NUMPAD6)
CHECKKEY(KEY_NUMPAD7)
CHECKKEY(KEY_NUMPAD8)
CHECKKEY(KEY_NUMPAD9)
CHECKKEY(KEY_MULTIPLY)
CHECKKEY(KEY_ADD)
CHECKKEY(KEY_SEPARATOR)
CHECKKEY(KEY_SUBTRACT)
CHECKKEY(KEY_DECIMAL)
CHECKKEY(KEY_DIVIDE)
CHECKKEY(KEY_F1)
CHECKKEY(KEY_F2)
CHECKKEY(KEY_F3)
CHECKKEY(KEY_F4)
CHECKKEY(KEY_F5)
CHECKKEY(KEY_F6)
CHECKKEY(KEY_F7)
CHECKKEY(KEY_F8)
CHECKKEY(KEY_F9)
CHECKKEY(KEY_F10)
CHECKKEY(KEY_F11)
CHECKKEY(KEY_F12)
CHECKKEY(KEY_F13)
CHECKKEY(KEY_F14)
CHECKKEY(KEY_F15)
CHECKKEY(KEY_F16)
CHECKKEY(KEY_F17)
CHECKKEY(KEY_F18)
CHECKKEY(KEY_F19)
CHECKKEY(KEY_F20)
CHECKKEY(KEY_F21)
CHECKKEY(KEY_F22)
CHECKKEY(KEY_F23)
CHECKKEY(KEY_F24)
CHECKKEY(KEY_NUMLOCK)
CHECKKEY(KEY_SCROLL)
CHECKKEY(KEY_LSHIFT)
CHECKKEY(KEY_RSHIFT)
CHECKKEY(KEY_LCONTROL)
CHECKKEY(KEY_RCONTROL)
CHECKKEY(KEY_LMENU)
CHECKKEY(KEY_RMENU)
CHECKKEY(KEY_PLUS)
CHECKKEY(KEY_COMMA)
CHECKKEY(KEY_MINUS)
CHECKKEY(KEY_PERIOD)
CHECKKEY(KEY_ATTN)
CHECKKEY(KEY_CRSEL)
CHECKKEY(KEY_EXSEL)
CHECKKEY(KEY_EREOF)
CHECKKEY(KEY_PLAY)
CHECKKEY(KEY_ZOOM)
CHECKKEY(KEY_PA1)
CHECKKEY(KEY_OEM_CLEAR)
return irr::KEY_KEY_CODES_COUNT;
}
/*
Key config
*/
// A simple cache for quicker lookup
core::map<std::string, irr::EKEY_CODE> g_key_setting_cache;
irr::EKEY_CODE getKeySetting(const char *settingname)
{
core::map<std::string, irr::EKEY_CODE>::Node *n;
n = g_key_setting_cache.find(settingname);
if(n)
return n->getValue();
irr::EKEY_CODE c = keyname_to_keycode(g_settings.get(settingname).c_str());
g_key_setting_cache.insert(settingname, c);
return c;
}

27
src/keycode.h Normal file
View File

@ -0,0 +1,27 @@
/*
Minetest-c55
Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "common_irrlicht.h"
irr::EKEY_CODE keyname_to_keycode(const char *name);
// Key configuration getter
irr::EKEY_CODE getKeySetting(const char *settingname);

View File

@ -137,10 +137,10 @@ Networking and serialization:
TODO: Get rid of GotSplitPacketException TODO: Get rid of GotSplitPacketException
GUI: User Interface:
---- ---------------
TODO: Configuration menu, at least for keys TODO: Use getKeySetting everywhere for ESC key and stuff
Graphics: Graphics:
--------- ---------
@ -326,6 +326,7 @@ Making it more portable:
//#include "tile.h" //#include "tile.h"
#include "materials.h" #include "materials.h"
#include "game.h" #include "game.h"
#include "keycode.h"
// This makes textures // This makes textures
ITextureSource *g_texturesource = NULL; ITextureSource *g_texturesource = NULL;
@ -721,7 +722,8 @@ public:
if(counter1 < 0.0) if(counter1 < 0.0)
{ {
counter1 = 0.1*Rand(1, 40); counter1 = 0.1*Rand(1, 40);
keydown[irr::KEY_SPACE] = !keydown[irr::KEY_SPACE]; keydown[getKeySetting("keymap_jump")] =
!keydown[getKeySetting("keymap_jump")];
} }
} }
{ {
@ -730,7 +732,8 @@ public:
if(counter1 < 0.0) if(counter1 < 0.0)
{ {
counter1 = 0.1*Rand(1, 40); counter1 = 0.1*Rand(1, 40);
keydown[irr::KEY_KEY_E] = !keydown[irr::KEY_KEY_E]; keydown[getKeySetting("keymap_special1")] =
!keydown[getKeySetting("keymap_special1")];
} }
} }
{ {
@ -739,7 +742,8 @@ public:
if(counter1 < 0.0) if(counter1 < 0.0)
{ {
counter1 = 0.1*Rand(1, 40); counter1 = 0.1*Rand(1, 40);
keydown[irr::KEY_KEY_W] = !keydown[irr::KEY_KEY_W]; keydown[getKeySetting("keymap_forward")] =
!keydown[getKeySetting("keymap_forward")];
} }
} }
{ {
@ -748,7 +752,8 @@ public:
if(counter1 < 0.0) if(counter1 < 0.0)
{ {
counter1 = 0.1*Rand(1, 40); counter1 = 0.1*Rand(1, 40);
keydown[irr::KEY_KEY_A] = !keydown[irr::KEY_KEY_A]; keydown[getKeySetting("keymap_left")] =
!keydown[getKeySetting("keymap_left")];
} }
} }
{ {