Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/inputdevice/src/lib/event/key_mapper.cc @ 10632

Last change on this file since 10632 was 10632, checked in by snellen, 18 years ago

finished… testing needed

File size: 8.7 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer: Christian Meyer
14
15   This code was inspired by the command_node.cc code from Christian Meyer in revision
16   4386 and earlier.
17*/
18
19#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
20
21#include "key_mapper.h"
22
23#include "event_def.h"
24
25#include "orxonox_globals.h"
26#include "parser/ini_parser/ini_parser.h"
27#include "parser/preferences/preferences.h"
28#include "key_names.h"
29#include "event_def.h"
30#include "debug.h"
31
32
33
34ObjectListDefinition(KeyMapper);
35
36/* initialize all variables to a reasonable value*/
37int KeyMapper::PEV_FORWARD           = EV_UNKNOWN;
38int KeyMapper::PEV_BACKWARD          = EV_UNKNOWN;
39int KeyMapper::PEV_LEFT              = EV_UNKNOWN;
40int KeyMapper::PEV_RIGHT             = EV_UNKNOWN;
41int KeyMapper::PEV_UP                = EV_UNKNOWN;
42int KeyMapper::PEV_DOWN              = EV_UNKNOWN;
43int KeyMapper::PEV_ROLL_LEFT         = EV_UNKNOWN;
44int KeyMapper::PEV_ROLL_RIGHT        = EV_UNKNOWN;
45int KeyMapper::PEV_STRAFE_LEFT       = EV_UNKNOWN;
46int KeyMapper::PEV_STRAFE_RIGHT      = EV_UNKNOWN;
47int KeyMapper::PEV_JUMP              = EV_UNKNOWN;
48int KeyMapper::PEV_ACTION            = EV_UNKNOWN;
49
50int KeyMapper::PEV_FIRE1             = EV_UNKNOWN;
51int KeyMapper::PEV_FIRE2             = EV_UNKNOWN;
52int KeyMapper::PEV_PREVIOUS_WEAPON   = EV_UNKNOWN;
53int KeyMapper::PEV_NEXT_WEAPON       = EV_UNKNOWN;
54
55int KeyMapper::PEV_CHANGE_SHIP       = EV_UNKNOWN;
56
57int KeyMapper::PEV_VIEW0             = EV_UNKNOWN;
58int KeyMapper::PEV_VIEW1             = EV_UNKNOWN;
59int KeyMapper::PEV_VIEW2             = EV_UNKNOWN;
60int KeyMapper::PEV_VIEW3             = EV_UNKNOWN;
61int KeyMapper::PEV_VIEW4             = EV_UNKNOWN;
62int KeyMapper::PEV_VIEW5             = EV_UNKNOWN;
63
64int KeyMapper::PEV_NEXT_WORLD        = EV_UNKNOWN;
65int KeyMapper::PEV_PREVIOUS_WORLD    = EV_UNKNOWN;
66
67int KeyMapper::PEV_PAUSE             = EV_UNKNOWN;
68int KeyMapper::PEV_QUIT              = EV_UNKNOWN;
69
70
71
72//! this is the mapping array from names to ids: enter all orxonox.conf keys here
73/** @todo use globals.h for this.... everything is done there for those Options,
74 * and you do not have to care about The namings, as they might change
75 */
76KeyMapper::KeyMapping KeyMapper::map[] = {
77      {&KeyMapper::PEV_FORWARD,              CONFIG_NAME_PLAYER_FORWARD,         SDLK_w},
78      {&KeyMapper::PEV_BACKWARD,             CONFIG_NAME_PLAYER_BACKWARD,        SDLK_s},
79      {&KeyMapper::PEV_UP,                   CONFIG_NAME_PLAYER_UP,              SDLK_r},
80      {&KeyMapper::PEV_DOWN,                 CONFIG_NAME_PLAYER_DOWN,            SDLK_f},
81      {&KeyMapper::PEV_LEFT,                 CONFIG_NAME_PLAYER_LEFT,            SDLK_a},
82      {&KeyMapper::PEV_RIGHT,                CONFIG_NAME_PLAYER_RIGHT,           SDLK_d},
83      {&KeyMapper::PEV_ROLL_RIGHT,           CONFIG_NAME_PLAYER_ROLL_LEFT,       SDLK_z},
84      {&KeyMapper::PEV_ROLL_LEFT,            CONFIG_NAME_PLAYER_ROLL_RIGHT,      SDLK_c},
85      {&KeyMapper::PEV_STRAFE_LEFT,          CONFIG_NAME_PLAYER_STRAFE_LEFT,     SDLK_q},
86      {&KeyMapper::PEV_STRAFE_RIGHT,         CONFIG_NAME_PLAYER_STRAFE_RIGHT,    SDLK_e},
87      {&KeyMapper::PEV_JUMP,                 CONFIG_NAME_PLAYER_JUMP,            SDLK_SPACE},
88      {&KeyMapper::PEV_ACTION,               CONFIG_NAME_PLAYER_ACTION,          SDLK_u},
89
90      {&KeyMapper::PEV_FIRE1,                CONFIG_NAME_PLAYER_FIRE,            EV_MOUSE_BUTTON_LEFT},
91      {&KeyMapper::PEV_FIRE2,                CONFIG_NAME_PLAYER_FIRE2,           EV_MOUSE_BUTTON_RIGHT},
92      {&KeyMapper::PEV_NEXT_WEAPON,          CONFIG_NAME_PLAYER_NEXT_WEAPON,     EV_MOUSE_BUTTON_WHEELUP},
93      {&KeyMapper::PEV_PREVIOUS_WEAPON,      CONFIG_NAME_PLAYER_PREV_WEAPON,     EV_MOUSE_BUTTON_WHEELDOWN},
94
95      {&KeyMapper::PEV_CHANGE_SHIP,          CONFIG_NAME_PLAYER_CHANGE_SHIP,     SDLK_g},
96
97
98      {&KeyMapper::PEV_VIEW0,                CONFIG_NAME_VIEW0,                  SDLK_1},
99      {&KeyMapper::PEV_VIEW1,                CONFIG_NAME_VIEW1,                  SDLK_2},
100      {&KeyMapper::PEV_VIEW2,                CONFIG_NAME_VIEW2,                  SDLK_3},
101      {&KeyMapper::PEV_VIEW3,                CONFIG_NAME_VIEW3,                  SDLK_4},
102      {&KeyMapper::PEV_VIEW4,                CONFIG_NAME_VIEW4,                  SDLK_5},
103      {&KeyMapper::PEV_VIEW5,                CONFIG_NAME_VIEW5,                  SDLK_6},
104
105      {&KeyMapper::PEV_NEXT_WORLD,           CONFIG_NAME_NEXT_WORLD,             SDLK_x},
106      {&KeyMapper::PEV_PREVIOUS_WORLD,       CONFIG_NAME_PREV_WORLD,             SDLK_z},
107
108      {&KeyMapper::PEV_PAUSE,                CONFIG_NAME_PAUSE,                  SDLK_p},
109      {&KeyMapper::PEV_QUIT,                 CONFIG_NAME_QUIT,                   SDLK_ESCAPE},
110      {NULL, "", 0}
111    };
112
113
114
115/**
116 *  standard constructor
117*/
118KeyMapper::KeyMapper ()
119{
120  this->registerObject(this, KeyMapper::_objectList);
121}
122
123
124/**
125 *  standard deconstructor
126*/
127KeyMapper::~KeyMapper ()
128{}
129
130
131/**
132 *  loads new key bindings from a file
133 * @param filename: The path and name of the file to load the bindings from
134*/
135void KeyMapper::loadKeyBindings (const std::string& fileName)
136{
137  IniParser parser(fileName);
138  this->loadKeyBindings(&parser);
139}
140
141void KeyMapper::loadKeyBindings(IniParser* iniParser)
142{
143  IniParser::Section* section = iniParser->getSection (CONFIG_SECTION_CONTROL);
144  if( section == NULL)
145  {
146    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
147    return;
148  }
149  int* index;
150
151
152  for(IniParser::Entry::iterator entry = section->begin();
153      entry != section->end();
154      ++entry)
155  {
156    PRINTF(3)("Keys: Parsing %s, %s now.\n", (*entry).name().c_str(), (*entry).value().c_str());
157    // map the name to an sdl index
158    index = nameToIndex ((*entry).value());
159    // map the index to a internal name
160    this->mapKeys((*entry).name(), index);
161  }
162
163
164  // PARSE MISC SECTION
165  //   if( !iniParser->getSection (CONFIG_SECTION_MISC_KEYS))
166  //   {
167  //     PRINTF(1)("Could not find key bindings" CONFIG_SECTION_MISC_KEYS "\n");
168  //     return;
169  //   }
170  //
171  //   iniParser->firstVar();
172  //   while( iniParser->getCurrentName() != "" )
173  //   {
174  //     PRINTF(3)("MISC: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
175  //     index = nameToIndex (iniParser->getCurrentValue());
176  //     this->mapKeys(iniParser->getCurrentName(), index);
177  //     iniParser->nextVar();
178  //   }
179}
180
181void KeyMapper::loadKeyBindings()
182{
183  if( !Preferences::getInstance()->sectionExists(CONFIG_SECTION_CONTROL))
184  {
185    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
186    return;
187  }
188  int* index;
189
190  std::list<std::string> keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_CONTROL);
191  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
192  {
193    PRINTF(3)("Keys: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, "").c_str());
194    // map the name to an sdl index
195    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, ""));
196    // map the index to a internal name
197    this->mapKeys(*it, index);
198  }
199}
200
201/**
202 *  this function looks up name to key index
203 * @param the name of the button
204*/
205int* KeyMapper::nameToIndex (const std::string& name)
206{
207  coord[0] = -1;
208  coord[1] = -1;
209  int c;
210  if( (c = keynameToSDLK (name)) != -1)
211  {
212    coord[1] = c;
213    coord[0] = 0;
214  }
215  if( (c = buttonnameToSDLB (name)) != -1)
216  {
217    coord[1] = c;
218    coord[0] = 1;
219  }
220  return coord;
221}
222
223
224/**
225 *  the function maps name to key ids
226 * @param name of the key
227 * @param id of the key
228*/
229void KeyMapper::mapKeys(const std::string& name, int* index)
230{
231  for( int i = 0; map[i].pValue != NULL; ++i )
232  {
233    if( name == map[i].pName)
234    {
235      if( index[0] == 0)
236      {
237        *map[i].pValue = index[1];
238        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLKToKeyname(index[1]).c_str(), index[1]);
239        break;
240      }
241      else
242      {
243        *map[i].pValue = index[1];
244        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLBToButtonname(index[1]).c_str(), index[1]);
245        break;
246      }
247    }
248  }
249}
250
251
252/**
253 *  this function gives some debug information about the key mapper class
254*/
255void KeyMapper::debug()
256{
257  PRINT(0)("\n==========================| KeyMapper::debug() |===\n");
258  for(int i = 0; map[i].pValue != NULL; ++i)
259  {
260    PRINT(0)("%s = %i\n",map[i].pName.c_str(), *map[i].pValue);
261  }
262  PRINT(0)("=======================================================\n");
263}
Note: See TracBrowser for help on using the repository browser.